From: Yedidya Feldblum Date: Tue, 7 Nov 2017 01:29:12 +0000 (-0800) Subject: crange, and range const overloads X-Git-Tag: v2017.11.13.00~28 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=0718262d68d759b2db1007f70fe8d5faf3aed915 crange, and range const overloads Summary: [Folly] `crange`, and `range` `const` overloads. Instead of using universal reference for `range` overloads, bifurcate explicitly between `&` and `const&` overloads. The `&` overloads return `Range` while the `const&` overloads return `Range`. Add `crange` overloads, which may accept non-`const` arguments but will return `Range` results anyway. Reviewed By: ot Differential Revision: D6242038 fbshipit-source-id: bc373c3288ea88792f04b49a372262d12204b586 --- diff --git a/folly/Range.h b/folly/Range.h index 6a8161d2..228a8d55 100644 --- a/folly/Range.h +++ b/folly/Range.h @@ -1012,22 +1012,43 @@ constexpr Range range(Iter first, Iter last) { * Creates a range to reference the contents of a contiguous-storage container. */ // Use pointers for types with '.data()' member -template < - class Collection, - class T = typename std::remove_pointer< - decltype(std::declval().data())>::type> -constexpr Range range(Collection&& v) { - return Range(v.data(), v.data() + v.size()); +template +constexpr auto range(Collection& v) -> Range { + return Range(v.data(), v.data() + v.size()); +} +template +constexpr auto range(Collection const& v) -> Range { + return Range(v.data(), v.data() + v.size()); +} +template +constexpr auto crange(Collection const& v) -> Range { + return Range(v.data(), v.data() + v.size()); } template constexpr Range range(T (&array)[n]) { return Range(array, array + n); } +template +constexpr Range range(T const (&array)[n]) { + return Range(array, array + n); +} +template +constexpr Range crange(T const (&array)[n]) { + return Range(array, array + n); +} template -constexpr Range range(const std::array& array) { - return Range{array}; +constexpr Range range(std::array& array) { + return Range{array}; +} +template +constexpr Range range(std::array const& array) { + return Range{array}; +} +template +constexpr Range crange(std::array const& array) { + return Range{array}; } typedef Range StringPiece; diff --git a/folly/test/RangeTest.cpp b/folly/test/RangeTest.cpp index db8b60e3..dbe8d88f 100644 --- a/folly/test/RangeTest.cpp +++ b/folly/test/RangeTest.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -1091,7 +1092,9 @@ template void testRangeFunc(C&& x, size_t n) { const auto& cx = x; // type, conversion checks - Range r1 = range(std::forward(x)); + using R1Iter = + _t>::value, int*, int const*>>; + Range r1 = range(std::forward(x)); Range r2 = range(std::forward(x)); Range r3 = range(cx); Range r5 = range(std::move(cx)); @@ -1177,6 +1180,57 @@ TEST(RangeFunc, ConstexprCollection) { EXPECT_EQ(2, numCollRangeSize); } +TEST(CRangeFunc, CArray) { + int numArray[4] = {3, 17, 1, 9}; + auto const numArrayRange = crange(numArray); + EXPECT_TRUE( + (std::is_same::value)); + EXPECT_THAT(numArrayRange, testing::ElementsAreArray(numArray)); +} + +TEST(CRangeFunc, StdArray) { + std::array numArray = {{3, 17, 1, 9}}; + auto const numArrayRange = crange(numArray); + EXPECT_TRUE( + (std::is_same::value)); + EXPECT_THAT(numArrayRange, testing::ElementsAreArray(numArray)); +} + +TEST(CRangeFunc, StdArrayZero) { + std::array numArray = {}; + auto const numArrayRange = crange(numArray); + EXPECT_TRUE( + (std::is_same::value)); + EXPECT_THAT(numArrayRange, testing::ElementsAreArray(numArray)); +} + +TEST(CRangeFunc, Collection) { + class IntCollection { + public: + constexpr IntCollection(int* d, size_t s) : data_(d), size_(s) {} + constexpr int* data() { + return data_; + } + constexpr int const* data() const { + return data_; + } + constexpr size_t size() const { + return size_; + } + + private: + int* data_; + size_t size_; + }; + int numArray[4] = {3, 17, 1, 9}; + auto numPtr = static_cast(numArray); + auto numColl = IntCollection(numPtr + 1, 2); + auto const numCollRange = crange(numColl); + EXPECT_TRUE( + (std::is_same::value)); + EXPECT_THAT(numCollRange, testing::ElementsAreArray({17, 1})); +} + std::string get_rand_str( size_t size, std::uniform_int_distribution<>& dist,