X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FFixedString.h;h=ece7691b74d09b43a7e0b413394cce2b939410eb;hp=bf0d52e32a0b10a44841113ebc3f1eb77582ea63;hb=653053aa7a270129b35d405e3d196210c44ec6e2;hpb=8dde913d5369b884adc95dac86f825facc8d5244 diff --git a/folly/FixedString.h b/folly/FixedString.h index bf0d52e3..ece7691b 100644 --- a/folly/FixedString.h +++ b/folly/FixedString.h @@ -28,29 +28,13 @@ #include #include +#include +#include #include #include #include #include -// Define FOLLY_USE_CPP14_CONSTEXPR to be true if the compiler's C++14 -// constexpr support is "good enough". -#ifndef FOLLY_USE_CPP14_CONSTEXPR -#if defined(__clang__) -#define FOLLY_USE_CPP14_CONSTEXPR __cplusplus >= 201300L -#elif defined(__GNUC__) -#define FOLLY_USE_CPP14_CONSTEXPR __cplusplus >= 201304L -#else -#define FOLLY_USE_CPP14_CONSTEXPR 0 // MSVC? -#endif -#endif - -#if FOLLY_USE_CPP14_CONSTEXPR -#define FOLLY_CPP14_CONSTEXPR constexpr -#else -#define FOLLY_CPP14_CONSTEXPR inline -#endif - namespace folly { template @@ -120,7 +104,7 @@ enum class Cmp : int { LT = -1, EQ = 0, GT = 1 }; // Rather annoyingly, GCC's -Warray-bounds warning issues false positives for // this code. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61971 -#if defined(__GNUC__) && !defined(__CLANG__) && __GNUC__ <= 5 +#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 5 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Warray-bounds" #endif @@ -319,7 +303,7 @@ struct Helper { } }; -#if defined(__GNUC__) && !defined(__CLANG__) && __GNUC__ <= 4 +#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 4 #pragma GCC diagnostic pop #endif @@ -331,18 +315,6 @@ FOLLY_CPP14_CONSTEXPR void constexpr_swap(T& a, T& b) noexcept( b = std::move(tmp); } -// FUTURE: use const_log2 to fold instantiations of BasicFixedString together. -// All BasicFixedString instantiations could share the implementation -// of BasicFixedString, where M is the next highest power of 2 after N. -// -// Also, because of alignment of the data_ and size_ members, N should never be -// smaller than `(alignof(std::size_t)/sizeof(C))-1` (-1 because of the null -// terminator). OR, create a specialization for BasicFixedString that -// does not have a size_ member, since it is unnecessary. -constexpr std::size_t const_log2(std::size_t N, std::size_t log2 = 0u) { - return N / 2u == 0u ? log2 : const_log2(N / 2u, log2 + 1u); -} - // For constexpr reverse iteration over a BasicFixedString template struct ReverseIterator { @@ -437,7 +409,7 @@ struct ReverseIterator { } // namespace fixedstring } // namespace detail -// Defined in folly/Hash.h +// Defined in folly/hash/Hash.h std::uint32_t hsieh_hash32_buf(const void* buf, std::size_t len); /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * @@ -545,6 +517,15 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { friend class BasicFixedString; friend struct detail::fixedstring::Helper; + // FUTURE: use constexpr_log2 to fold instantiations of BasicFixedString + // together. All BasicFixedString instantiations could share the + // implementation of BasicFixedString, where M is the next highest power + // of 2 after N. + // + // Also, because of alignment of the data_ and size_ members, N should never + // be smaller than `(alignof(std::size_t)/sizeof(C))-1` (-1 because of the + // null terminator). OR, create a specialization for BasicFixedString + // that does not have a size_ member, since it is unnecessary. Char data_[N + 1u]; // +1 for the null terminator std::size_t size_; // Nbr of chars, not incl. null terminator. size_ <= N. @@ -809,29 +790,6 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { return *this; } - /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** - * Conversion to folly::Range - * \return `Range{begin(), end()}` - */ - template < - class Iter, - class = typename std::enable_if< - std::is_convertible::value>::type> - FOLLY_CPP14_CONSTEXPR /* implicit */ operator Range() noexcept { - return {begin(), end()}; - } - - /** - * \overload - */ - template < - class Iter, - class = typename std::enable_if< - std::is_convertible::value>::type> - constexpr /* implicit */ operator Range() const noexcept { - return {begin(), end()}; - } - /** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Conversion to folly::Range * \return `Range{begin(), end()}` @@ -1284,8 +1242,9 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { std::size_t count, Char ch) noexcept(false) { detail::fixedstring::checkOverflow(count, N - size_); - for (std::size_t i = 0u; i < count; ++i) + for (std::size_t i = 0u; i < count; ++i) { data_[size_ + i] = ch; + } size_ += count; data_[size_] = Char(0); return *this; @@ -1332,8 +1291,9 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { detail::fixedstring::checkOverflow(pos, that.size_); count = detail::fixedstring::checkOverflowOrNpos(count, that.size_ - pos); detail::fixedstring::checkOverflow(count, N - size_); - for (std::size_t i = 0u; i < count; ++i) + for (std::size_t i = 0u; i < count; ++i) { data_[size_ + i] = that.data_[pos + i]; + } size_ += count; data_[size_] = Char(0); return *this; @@ -1360,8 +1320,9 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { const Char* that, std::size_t count) noexcept(false) { detail::fixedstring::checkOverflow(count, N - size_); - for (std::size_t i = 0u; i < count; ++i) + for (std::size_t i = 0u; i < count; ++i) { data_[size_ + i] = that[i]; + } size_ += count; data_[size_] = Char(0); return *this; @@ -2069,8 +2030,9 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase { copy(Char* dest, std::size_t count, std::size_t pos) const noexcept(false) { detail::fixedstring::checkOverflow(pos, size_); for (std::size_t i = 0u; i < count; ++i) { - if (i + pos == size_) + if (i + pos == size_) { return size_; + } dest[i] = data_[i + pos]; } return count; @@ -3048,7 +3010,7 @@ inline namespace { // "const std::size_t&" is so that folly::npos has the same address in every // translation unit. This is to avoid potential violations of the ODR. constexpr const std::size_t& npos = detail::fixedstring::FixedStringBase::npos; -} +} // namespace #if defined(__GNUC__) #pragma GCC diagnostic push @@ -3101,8 +3063,8 @@ FOLLY_DEFINE_FIXED_STRING_UDL(64) FOLLY_DEFINE_FIXED_STRING_UDL(128) #undef FOLLY_DEFINE_FIXED_STRING_UDL -} -} +} // namespace string_literals +} // namespace literals // TODO: // // numeric conversions: @@ -3137,4 +3099,4 @@ FOLLY_DEFINE_FIXED_STRING_UDL(128) // constexpr FixedString to_fixed_string_ll() noexcept // template // constexpr FixedString to_fixed_string_ull() noexcept; -} +} // namespace folly