X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fsmall_vector.h;h=8f7641366581e57521d8d6310a0ec7f702eb65b8;hb=fd4ce7d13aa50de6023102b06b2aaa5e9b7d720f;hp=132ff241ee51621e8b3900ee7e7c4e9d449bff29;hpb=03e99d2e90996a2a424a20b1a99c90d245344a7e;p=folly.git diff --git a/folly/small_vector.h b/folly/small_vector.h index 132ff241..8f764136 100644 --- a/folly/small_vector.h +++ b/folly/small_vector.h @@ -1,5 +1,5 @@ /* - * Copyright 2014 Facebook, Inc. + * Copyright 2015 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,6 @@ #ifndef FOLLY_SMALL_VECTOR_H_ #define FOLLY_SMALL_VECTOR_H_ -#include - #include #include #include @@ -46,9 +44,11 @@ #include #include +#include #include +#include -#if defined(__GNUC__) && FOLLY_X64 +#if defined(__GNUC__) && (FOLLY_X64 || FOLLY_PPC64) # include # define FB_PACK_ATTR FOLLY_PACK_ATTR # define FB_PACK_PUSH FOLLY_PACK_PUSH @@ -109,10 +109,9 @@ namespace detail { !FOLLY_IS_TRIVIALLY_COPYABLE(T) >::type moveToUninitialized(T* first, T* last, T* out) { - auto const count = last - first; std::size_t idx = 0; try { - for (; idx < count; ++first, ++idx) { + for (; first != last; ++first, ++idx) { new (&out[idx]) T(std::move(*first)); } } catch (...) { @@ -383,7 +382,7 @@ public: typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; - explicit small_vector() {} + explicit small_vector() = default; small_vector(small_vector const& o) { auto n = o.size(); @@ -659,6 +658,17 @@ public: emplaceBack(std::forward(args)...); } + void emplace_back(const value_type& t) { + push_back(t); + } + void emplace_back(value_type& t) { + push_back(t); + } + + void emplace_back(value_type&& t) { + push_back(std::move(t)); + } + void push_back(value_type&& t) { if (capacity() == size()) { makeSize(std::max(size_type(2), 3 * size() / 2), &t, size()); @@ -669,9 +679,17 @@ public: } void push_back(value_type const& t) { - // Make a copy and forward to the rvalue value_type&& overload - // above. - push_back(value_type(t)); + // TODO: we'd like to make use of makeSize (it can be optimized better, + // because it manipulates the internals) + // unfortunately the current implementation only supports moving from + // a supplied rvalue, and doing an extra move just to reuse it is a perf + // net loss + if (size() == capacity()) {// && isInside(&t)) { + value_type tmp(t); + emplaceBack(std::move(tmp)); + } else { + emplaceBack(t); + } } void pop_back() { @@ -810,13 +828,6 @@ private: this->setSize(size() + 1); } - /* - * Special case of emplaceBack for rvalue - */ - void emplaceBack(value_type&& t) { - push_back(std::move(t)); - } - static iterator unconst(const_iterator it) { return const_cast(it); } @@ -872,7 +883,7 @@ private: // With iterators that only allow a single pass, we can't really // do anything sane here. while (first != last) { - push_back(*first++); + emplace_back(*first++); } return; } @@ -1047,7 +1058,7 @@ private: } } FB_PACK_ATTR; -#if FOLLY_X64 +#if (FOLLY_X64 || FOLLY_PPC64) typedef unsigned char InlineStorageType[sizeof(value_type) * MaxInline]; #else typedef typename std::aligned_storage< @@ -1130,7 +1141,17 @@ void swap(small_vector& a, ////////////////////////////////////////////////////////////////////// -} +namespace detail { + +// Format support. +template +struct IndexableTraits> + : public IndexableTraitsSeq> { +}; + +} // namespace detail + +} // namespace folly #pragma GCC diagnostic pop