Add constexpr to the simple folly::Range accessors (begin, end, data, empty, etc)
authorEric Niebler <eniebler@fb.com>
Wed, 30 Nov 2016 03:42:04 +0000 (19:42 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Wed, 30 Nov 2016 03:53:31 +0000 (19:53 -0800)
Summary: More constexpr is better!

Reviewed By: yfeldblum, luciang, ot

Differential Revision: D4244996

fbshipit-source-id: 30a9b726c115a92bb18538d7f18e50eccb0a1ef6

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

index 780e1c8645c18293bdd5c669354a80cde358514d..b715e1d04fe74f9e784168a896976aa7ae89b3f5 100644 (file)
@@ -363,16 +363,30 @@ public:
     // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71448
     return e_ - b_;
   }
-  size_type walk_size() const {
+  constexpr size_type walk_size() const {
     return std::distance(b_, e_);
   }
-  bool empty() const { return b_ == e_; }
-  Iter data() const { return b_; }
-  Iter start() const { return b_; }
-  Iter begin() const { return b_; }
-  Iter end() const { return e_; }
-  Iter cbegin() const { return b_; }
-  Iter cend() const { return e_; }
+  constexpr bool empty() const {
+    return b_ == e_;
+  }
+  constexpr Iter data() const {
+    return b_;
+  }
+  constexpr Iter start() const {
+    return b_;
+  }
+  constexpr Iter begin() const {
+    return b_;
+  }
+  constexpr Iter end() const {
+    return e_;
+  }
+  constexpr Iter cbegin() const {
+    return b_;
+  }
+  constexpr Iter cend() const {
+    return e_;
+  }
   value_type& front() {
     assert(b_ < e_);
     return *b_;
index cf577f9fa610e80864e83bb270d4cd6d13408208..e1130e5b32b10b49a219a6503f6784fe7f8ad312 100644 (file)
@@ -1297,3 +1297,15 @@ TEST(Range, Constructors) {
   EXPECT_EQ(subpiece1.begin(), subpiece2.begin());
   EXPECT_EQ(subpiece1.end(), subpiece2.end());
 }
+
+TEST(Range, ConstexprAccessors) {
+  constexpr StringPiece piece = range("hello");
+  static_assert(piece.size() == 6u, "");
+  static_assert(piece.end() - piece.begin() == 6u, "");
+  static_assert(piece.data() == piece.begin(), "");
+  static_assert(piece.start() == piece.begin(), "");
+  static_assert(piece.cbegin() == piece.begin(), "");
+  static_assert(piece.cend() == piece.end(), "");
+  static_assert(*piece.begin() == 'h', "");
+  static_assert(*(piece.end() - 1) == '\0', "");
+}