From: Lucian Grijincu Date: Thu, 10 Sep 2015 00:22:27 +0000 (-0700) Subject: folly: small_vector: emplace_back for iterator constructor (compat with std::vector) X-Git-Tag: deprecate-dynamic-initializer~429 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9f9e6d9638c6227f4f5f1b0c35fa3122eec651a4;p=folly.git folly: small_vector: emplace_back for iterator constructor (compat with std::vector) Summary: This works: std::vector v; std::vector> uv(v.begin(), v.end()) Make it work for small_vector as well. Reviewed By: @ot, @Gownta Differential Revision: D2426919 --- diff --git a/folly/small_vector.h b/folly/small_vector.h index ca62f147..df237553 100644 --- a/folly/small_vector.h +++ b/folly/small_vector.h @@ -883,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; } diff --git a/folly/test/small_vector_test.cpp b/folly/test/small_vector_test.cpp index cd365bea..f78d34ee 100644 --- a/folly/test/small_vector_test.cpp +++ b/folly/test/small_vector_test.cpp @@ -16,13 +16,16 @@ #include -#include -#include -#include #include +#include #include +#include +#include +#include +#include #include +#include #include @@ -802,3 +805,32 @@ TEST(small_vector, RVPushValueInsideVector) { ASSERT_EQ(1, v.back().value); } } + +TEST(small_vector, EmplaceIterCtor) { + std::vector v{new int(1), new int(2)}; + std::vector> uv(v.begin(), v.end()); + + std::vector w{new int(1), new int(2)}; + small_vector> uw(v.begin(), v.end()); +} + +TEST(small_vector, InputIterator) { + std::vector expected{125, 320, 512, 750, 333}; + std::string values = "125 320 512 750 333"; + std::istringstream is1(values); + std::istringstream is2(values); + + std::vector stdV{std::istream_iterator(is1), + std::istream_iterator()}; + ASSERT_EQ(stdV.size(), expected.size()); + for (size_t i = 0; i < expected.size(); i++) { + ASSERT_EQ(stdV[i], expected[i]); + } + + small_vector smallV{std::istream_iterator(is2), + std::istream_iterator()}; + ASSERT_EQ(smallV.size(), expected.size()); + for (size_t i = 0; i < expected.size(); i++) { + ASSERT_EQ(smallV[i], expected[i]); + } +}