Let folly::range(const std::array<...>&) be constexpr
authorYedidya Feldblum <yfeldblum@fb.com>
Fri, 11 Nov 2016 06:02:17 +0000 (22:02 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Fri, 11 Nov 2016 06:08:33 +0000 (22:08 -0800)
Summary:
[Folly] Let `folly::range(const std::array<...>&)` be `constexpr`.

This may be useful for future work.

Reviewed By: simpkins

Differential Revision: D4165608

fbshipit-source-id: 8f1064c3cdc07301e198acd596ff26724d603cdd

folly/Range.h
folly/test/RangeTest.cpp

index 06123d346611b3f836f259fb96db455be20f612a..780e1c8645c18293bdd5c669354a80cde358514d 100644 (file)
@@ -885,6 +885,12 @@ constexpr Range<T*> range(T (&array)[n]) {
   return Range<T*>(array, array + n);
 }
 
+template <class T, size_t n>
+constexpr Range<const T*> range(const std::array<T, n>& array) {
+  using r = Range<const T*>;
+  return array.empty() ? r{} : r(&array.at(0), &array.at(0) + n);
+}
+
 typedef Range<const char*> StringPiece;
 typedef Range<char*> MutableStringPiece;
 typedef Range<const unsigned char*> ByteRange;
index 49e9a86c906058b736d0cc9367b05847de493dd0..c918a53c2c2a1f11f1e29bd87e18a38fc408aed1 100644 (file)
@@ -1106,6 +1106,21 @@ TEST(RangeFunc, ConstexprCArray) {
   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);