+TEST(RangeFunc, ConstexprCArray) {
+ static constexpr const int numArray[4] = {3, 17, 1, 9};
+ constexpr const auto numArrayRange = range(numArray);
+ EXPECT_EQ(17, numArrayRange[1]);
+ constexpr const auto numArrayRangeSize = numArrayRange.size();
+ EXPECT_EQ(4, numArrayRangeSize);
+}
+
+TEST(RangeFunc, ConstexprStdArray) {
+ static constexpr const std::array<int, 4> numArray = {{3, 17, 1, 9}};
+ constexpr const auto numArrayRange = range(numArray);
+ EXPECT_EQ(17, numArrayRange[1]);
+ constexpr const auto numArrayRangeSize = numArrayRange.size();
+ EXPECT_EQ(4, numArrayRangeSize);
+}
+
+TEST(RangeFunc, ConstexprStdArrayZero) {
+ static constexpr const std::array<int, 0> numArray = {};
+ constexpr const auto numArrayRange = range(numArray);
+ constexpr const auto numArrayRangeSize = numArrayRange.size();
+ EXPECT_EQ(0, numArrayRangeSize);
+}
+
+TEST(RangeFunc, ConstexprIteratorPair) {
+ static constexpr const int numArray[4] = {3, 17, 1, 9};
+ constexpr const auto numPtr = static_cast<const int*>(numArray);
+ constexpr const auto numIterRange = range(numPtr + 1, numPtr + 3);
+ EXPECT_EQ(1, numIterRange[1]);
+ constexpr const auto numIterRangeSize = numIterRange.size();
+ EXPECT_EQ(2, numIterRangeSize);
+}
+
+TEST(RangeFunc, ConstexprCollection) {
+ class IntCollection {
+ public:
+ constexpr IntCollection(const int* d, size_t s) : data_(d), size_(s) {}
+ constexpr const int* data() const {
+ return data_;
+ }
+ constexpr size_t size() const {
+ return size_;
+ }
+
+ private:
+ const int* data_;
+ size_t size_;
+ };
+ static constexpr const int numArray[4] = {3, 17, 1, 9};
+ constexpr const auto numPtr = static_cast<const int*>(numArray);
+ constexpr const auto numColl = IntCollection(numPtr + 1, 2);
+ constexpr const auto numCollRange = range(numColl);
+ EXPECT_EQ(1, numCollRange[1]);
+ constexpr const auto numCollRangeSize = numCollRange.size();
+ EXPECT_EQ(2, numCollRangeSize);
+}
+
+TEST(CRangeFunc, CArray) {
+ int numArray[4] = {3, 17, 1, 9};
+ auto const numArrayRange = crange(numArray);
+ EXPECT_TRUE(
+ (std::is_same<int const*, decltype(numArrayRange)::iterator>::value));
+ EXPECT_THAT(numArrayRange, testing::ElementsAreArray(numArray));
+}
+
+TEST(CRangeFunc, StdArray) {
+ std::array<int, 4> numArray = {{3, 17, 1, 9}};
+ auto const numArrayRange = crange(numArray);
+ EXPECT_TRUE(
+ (std::is_same<int const*, decltype(numArrayRange)::iterator>::value));
+ EXPECT_THAT(numArrayRange, testing::ElementsAreArray(numArray));
+}
+
+TEST(CRangeFunc, StdArrayZero) {
+ std::array<int, 0> numArray = {};
+ auto const numArrayRange = crange(numArray);
+ EXPECT_TRUE(
+ (std::is_same<int const*, decltype(numArrayRange)::iterator>::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<int*>(numArray);
+ auto numColl = IntCollection(numPtr + 1, 2);
+ auto const numCollRange = crange(numColl);
+ EXPECT_TRUE(
+ (std::is_same<int const*, decltype(numCollRange)::iterator>::value));
+ EXPECT_THAT(numCollRange, testing::ElementsAreArray({17, 1}));
+}
+
+std::string get_rand_str(
+ size_t size,
+ std::uniform_int_distribution<>& dist,
+ std::mt19937& gen) {