X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FFBString.h;h=4882aac577650dc0689c91baa9269e5bf4438390;hb=b22935cd23251a9958f73242cb1dc44dfc75c5f5;hp=5db1e61e19329bc2fc86c82d90d2bb0ff18036e4;hpb=6c244d162cd8f6e598202146c03b9bf13499d113;p=folly.git diff --git a/folly/FBString.h b/folly/FBString.h index 5db1e61e..4882aac5 100644 --- a/folly/FBString.h +++ b/folly/FBString.h @@ -33,13 +33,14 @@ #pragma GCC system_header -#include "basic_fbstring_malloc.h" +#include "basic_fbstring_malloc.h" // @manual // When used as std::string replacement always disable assertions. #define FBSTRING_ASSERT(expr) /* empty */ #else // !_LIBSTDCXX_FBSTRING +#include #include // libc++ doesn't provide this header, nor does msvc @@ -53,9 +54,9 @@ #include #include -#include -#include #include +#include +#include #include // When used in folly, assertions are not disabled. @@ -87,12 +88,19 @@ FOLLY_GCC_DISABLE_WARNING("-Warray-bounds") #define throw FOLLY_FBSTRING_MAY_NOT_USE_THROW #ifdef _LIBSTDCXX_FBSTRING -namespace std _GLIBCXX_VISIBILITY(default) { -_GLIBCXX_BEGIN_NAMESPACE_VERSION +#define FOLLY_FBSTRING_BEGIN_NAMESPACE \ + namespace std _GLIBCXX_VISIBILITY(default) { \ + _GLIBCXX_BEGIN_NAMESPACE_VERSION +#define FOLLY_FBSTRING_END_NAMESPACE \ + _GLIBCXX_END_NAMESPACE_VERSION \ + } // namespace std #else -namespace folly { +#define FOLLY_FBSTRING_BEGIN_NAMESPACE namespace folly { +#define FOLLY_FBSTRING_END_NAMESPACE } // namespace folly #endif +FOLLY_FBSTRING_BEGIN_NAMESPACE + #if defined(__clang__) # if __has_feature(address_sanitizer) # define FBSTRING_SANITIZE_ADDRESS @@ -223,7 +231,7 @@ enum class AcquireMallocatedString {}; template class fbstring_core_model { -public: + public: fbstring_core_model(); fbstring_core_model(const fbstring_core_model &); ~fbstring_core_model(); @@ -272,7 +280,7 @@ public: // the string without reallocation. For reference-counted strings, // it should fork the data even if minCapacity < size(). void reserve(size_t minCapacity); -private: + private: // Do not implement fbstring_core_model& operator=(const fbstring_core_model &); }; @@ -305,7 +313,7 @@ private: * to extract capacity/category. */ template class fbstring_core { -protected: + protected: // It's MSVC, so we just have to guess ... and allow an override #ifdef _MSC_VER # ifdef FOLLY_ENDIAN_BE @@ -317,7 +325,7 @@ protected: static constexpr auto kIsLittleEndian = __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__; #endif -public: + public: fbstring_core() noexcept { reset(); } fbstring_core(const fbstring_core & rhs) { @@ -493,7 +501,9 @@ public: if (RefCounted::refs(ml_.data_) > 1) { return ml_.size_; } - default: {} + break; + default: + break; } return ml_.capacity(); } @@ -502,7 +512,7 @@ public: return category() == Category::isLarge && RefCounted::refs(ml_.data_) > 1; } -private: + private: // Disabled fbstring_core & operator=(const fbstring_core & rhs); @@ -747,10 +757,13 @@ inline void fbstring_core::initSmall( switch ((byteSize + wordWidth - 1) / wordWidth) { // Number of words. case 3: ml_.capacity_ = reinterpret_cast(data)[2]; + FOLLY_FALLTHROUGH; case 2: ml_.size_ = reinterpret_cast(data)[1]; + FOLLY_FALLTHROUGH; case 1: ml_.data_ = *reinterpret_cast(const_cast(data)); + FOLLY_FALLTHROUGH; case 0: break; } @@ -976,7 +989,7 @@ inline void fbstring_core::shrinkLarge(const size_t delta) { */ template class dummy_fbstring_core { -public: + public: dummy_fbstring_core() { } dummy_fbstring_core(const dummy_fbstring_core& another) @@ -1019,7 +1032,7 @@ public: backend_.reserve(minCapacity); } -private: + private: std::basic_string backend_; }; #endif // !_LIBSTDCXX_FBSTRING @@ -1032,10 +1045,11 @@ private: #ifdef _LIBSTDCXX_FBSTRING template #else -template , - class A = std::allocator, - class Storage = fbstring_core > +template < + typename E, + class T = std::char_traits, + class A = std::allocator, + class Storage = fbstring_core> #endif class basic_fbstring { static void enforce( @@ -1100,7 +1114,7 @@ class basic_fbstring { static constexpr size_type npos = size_type(-1); typedef std::true_type IsRelocatable; -private: + private: static void procrustes(size_type& n, size_type nmax) { if (n > nmax) { n = nmax; @@ -1109,7 +1123,7 @@ private: static size_type traitsLength(const value_type* s); -public: + public: // C++11 21.4.2 construct/copy/destroy // Note: while the following two constructors can be (and previously were) @@ -1391,7 +1405,7 @@ public: basic_fbstring& append(size_type n, value_type c); - template + template basic_fbstring& append(InputIterator first, InputIterator last) { insert(end(), first, last); return *this; @@ -1406,7 +1420,9 @@ public: } basic_fbstring& assign(const basic_fbstring& str) { - if (&str == this) return *this; + if (&str == this) { + return *this; + } return assign(str.data(), str.size()); } @@ -1482,29 +1498,29 @@ public: } #endif -private: - iterator - insertImplDiscr(const_iterator i, size_type n, value_type c, std::true_type); - - template - iterator - insertImplDiscr(const_iterator i, InputIter b, InputIter e, std::false_type); - - template - iterator insertImpl( - const_iterator i, - FwdIterator s1, - FwdIterator s2, - std::forward_iterator_tag); - - template - iterator insertImpl( - const_iterator i, - InputIterator b, - InputIterator e, - std::input_iterator_tag); - -public: + private: + iterator + insertImplDiscr(const_iterator i, size_type n, value_type c, std::true_type); + + template + iterator + insertImplDiscr(const_iterator i, InputIter b, InputIter e, std::false_type); + + template + iterator insertImpl( + const_iterator i, + FwdIterator s1, + FwdIterator s2, + std::forward_iterator_tag); + + template + iterator insertImpl( + const_iterator i, + InputIterator b, + InputIterator e, + std::input_iterator_tag); + + public: template iterator insert(const_iterator p, ItOrLength first_or_n, ItOrChar last_or_c) { using Sel = std::integral_constant< @@ -1588,36 +1604,37 @@ public: return replace(i1, i2, s, traitsLength(s)); } -private: - basic_fbstring& replaceImplDiscr( - iterator i1, - iterator i2, - const value_type* s, - size_type n, - std::integral_constant); - - basic_fbstring& replaceImplDiscr( - iterator i1, - iterator i2, - size_type n2, - value_type c, - std::integral_constant); - - template - basic_fbstring& replaceImplDiscr( - iterator i1, - iterator i2, - InputIter b, - InputIter e, - std::integral_constant); - -private: - template - bool replaceAliased(iterator /* i1 */, - iterator /* i2 */, - FwdIterator /* s1 */, - FwdIterator /* s2 */, - std::false_type) { + private: + basic_fbstring& replaceImplDiscr( + iterator i1, + iterator i2, + const value_type* s, + size_type n, + std::integral_constant); + + basic_fbstring& replaceImplDiscr( + iterator i1, + iterator i2, + size_type n2, + value_type c, + std::integral_constant); + + template + basic_fbstring& replaceImplDiscr( + iterator i1, + iterator i2, + InputIter b, + InputIter e, + std::integral_constant); + + private: + template + bool replaceAliased( + iterator /* i1 */, + iterator /* i2 */, + FwdIterator /* s1 */, + FwdIterator /* s2 */, + std::false_type) { return false; } @@ -1829,7 +1846,7 @@ private: return r != 0 ? r : n1 > n2 ? 1 : n1 < n2 ? -1 : 0; } -private: + private: // Data Storage store_; }; @@ -2316,7 +2333,7 @@ basic_fbstring::find_first_of( } const_iterator i(begin() + pos), finish(end()); for (; i != finish; ++i) { - if (traits_type::find(s, n, *i) != 0) { + if (traits_type::find(s, n, *i) != nullptr) { return i - begin(); } } @@ -2331,7 +2348,7 @@ basic_fbstring::find_last_of( pos = std::min(pos, length() - 1); const_iterator i(begin() + pos); for (;; --i) { - if (traits_type::find(s, n, *i) != 0) { + if (traits_type::find(s, n, *i) != nullptr) { return i - begin(); } if (i == begin()) { @@ -2349,7 +2366,7 @@ basic_fbstring::find_first_not_of( if (pos < length()) { const_iterator i(begin() + pos), finish(end()); for (; i != finish; ++i) { - if (traits_type::find(s, n, *i) == 0) { + if (traits_type::find(s, n, *i) == nullptr) { return i - begin(); } } @@ -2365,7 +2382,7 @@ basic_fbstring::find_last_not_of( pos = std::min(pos, size() - 1); const_iterator i(begin() + pos); for (;; --i) { - if (traits_type::find(s, n, *i) == 0) { + if (traits_type::find(s, n, *i) == nullptr) { return i - begin(); } if (i == begin()) { @@ -2834,11 +2851,9 @@ typedef basic_fbstring fbstring; template FOLLY_ASSUME_RELOCATABLE(basic_fbstring); -#else -_GLIBCXX_END_NAMESPACE_VERSION #endif -} // namespace folly +FOLLY_FBSTRING_END_NAMESPACE #ifndef _LIBSTDCXX_FBSTRING @@ -2866,7 +2881,7 @@ namespace std { FOLLY_FBSTRING_HASH -} // namespace std +} // namespace std #undef FOLLY_FBSTRING_HASH #undef FOLLY_FBSTRING_HASH1 @@ -2881,3 +2896,13 @@ FOLLY_POP_WARNING #undef FBSTRING_LIKELY #undef FBSTRING_UNLIKELY #undef FBSTRING_ASSERT + +#ifndef _LIBSTDCXX_FBSTRING +namespace folly { +template +struct IsSomeString; + +template <> +struct IsSomeString : std::true_type {}; +} // namespace folly +#endif