-// Hook into boost's type traits
-namespace boost {
-template <class T>
-struct has_nothrow_constructor<folly::basic_fbstring<T> > : true_type {
- enum { value = true };
+inline void toLowerAscii(std::string& str) {
+ // str[0] is legal also if the string is empty.
+ toLowerAscii(&str[0], str.size());
+}
+
+template <
+ class Iterator = const char*,
+ class Base = folly::Range<boost::u8_to_u32_iterator<Iterator>>>
+class UTF8Range : public Base {
+ public:
+ /* implicit */ UTF8Range(const folly::Range<Iterator> baseRange)
+ : Base(boost::u8_to_u32_iterator<Iterator>(
+ baseRange.begin(), baseRange.begin(), baseRange.end()),
+ boost::u8_to_u32_iterator<Iterator>(
+ baseRange.end(), baseRange.begin(), baseRange.end())) {}
+ /* implicit */ UTF8Range(const std::string& baseString)
+ : Base(folly::Range<Iterator>(baseString)) {}