X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FPadded.h;h=88282d9d12c80a7f04eb0cbd9ec4d6bde2e1dd68;hb=bb9a22375539730d9e6d46ddd2cb1f6da78a4120;hp=c5b53a7c94ad88c6aef460e29ffd6193dd18046d;hpb=8ce13dccd5135e6b8bb8855e1ee74a53a69723b9;p=folly.git diff --git a/folly/Padded.h b/folly/Padded.h index c5b53a7c..88282d9d 100644 --- a/folly/Padded.h +++ b/folly/Padded.h @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ * limitations under the License. */ -#ifndef FOLLY_PADDED_H_ -#define FOLLY_PADDED_H_ +#pragma once +#include #include #include #include @@ -27,6 +27,7 @@ #include +#include #include /** @@ -66,7 +67,7 @@ struct NodeValid::type> { typedef void type; }; -} // namespace detail +} // namespace detail template class Node::type> { @@ -189,7 +190,7 @@ struct IteratorBase { > type; }; -} // namespace detail +} // namespace detail /** * Wrapper around iterators to Node to return iterators to the underlying @@ -344,13 +345,14 @@ class Adaptor { lastCount_(lastCount) { } explicit Adaptor(size_t n, const value_type& value = value_type()) - : c_(Node::nodeCount(n), fullNode(value)), - lastCount_(n % Node::kElementCount ?: Node::kElementCount) { + : c_(Node::nodeCount(n), fullNode(value)) { + const auto count = n % Node::kElementCount; + lastCount_ = count != 0 ? count : Node::kElementCount; } Adaptor(const Adaptor&) = default; Adaptor& operator=(const Adaptor&) = default; - Adaptor(Adaptor&& other) + Adaptor(Adaptor&& other) noexcept : c_(std::move(other.c_)), lastCount_(other.lastCount_) { other.lastCount_ = Node::kElementCount; @@ -383,7 +385,7 @@ class Adaptor { iterator end() { auto it = iterator(c_.end()); if (lastCount_ != Node::kElementCount) { - it -= (Node::kElementCount - lastCount_); + it -= difference_type(Node::kElementCount - lastCount_); } return it; } @@ -424,12 +426,13 @@ class Adaptor { return c_.back().data()[lastCount_ - 1]; } + template + void emplace_back(Args&&... args) { + new (allocate_back()) value_type(std::forward(args)...); + } + void push_back(value_type x) { - if (lastCount_ == Node::kElementCount) { - c_.push_back(Node()); - lastCount_ = 0; - } - c_.back().data()[lastCount_++] = std::move(x); + emplace_back(std::move(x)); } void pop_back() { @@ -490,6 +493,14 @@ class Adaptor { } private: + value_type* allocate_back() { + if (lastCount_ == Node::kElementCount) { + container_emplace_back_or_push_back(c_); + lastCount_ = 0; + } + return &c_.back().data()[lastCount_++]; + } + static Node fullNode(const value_type& value) { Node n; std::fill(n.data(), n.data() + kElementsPerNode, value); @@ -499,7 +510,5 @@ class Adaptor { size_t lastCount_; // number of elements in last Node }; -} // namespace padded -} // namespace folly - -#endif /* FOLLY_PADDED_H_ */ +} // namespace padded +} // namespace folly