X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FRange.h;h=9e392cf42de4f20b35e610fd0cfdd846d89d2e51;hp=d2077bdb85256054c906e2a10dc9b0698fc6f416;hb=1c86749b4bc3c7f0ec85a8e5820e3797e84381c6;hpb=1d804f037c302280d3d89ac408056ea3cfe7989f diff --git a/folly/Range.h b/folly/Range.h index d2077bdb..9e392cf4 100644 --- a/folly/Range.h +++ b/folly/Range.h @@ -61,7 +61,7 @@ namespace folly { -template class Range; +template class Range; /** * Finds the first occurrence of needle in haystack. The algorithm is on @@ -69,9 +69,10 @@ template class Range; * as Boyer-Moore. On the upside, it does not do any upfront * preprocessing and does not allocate memory. */ -template ::value_type>> -inline size_t qfind(const Range & haystack, - const Range & needle, +template ::value_type>> +inline size_t qfind(const Range & haystack, + const Range & needle, Comp eq = Comp()); /** @@ -79,27 +80,27 @@ inline size_t qfind(const Range & haystack, * offset reported to the beginning of haystack, or string::npos if * needle wasn't found. */ -template -size_t qfind(const Range & haystack, - const typename Range::value_type& needle); +template +size_t qfind(const Range & haystack, + const typename Range::value_type& needle); /** * Finds the last occurrence of needle in haystack. The result is the * offset reported to the beginning of haystack, or string::npos if * needle wasn't found. */ -template -size_t rfind(const Range & haystack, - const typename Range::value_type& needle); +template +size_t rfind(const Range & haystack, + const typename Range::value_type& needle); /** * Finds the first occurrence of any element of needle in * haystack. The algorithm is O(haystack.size() * needle.size()). */ -template -inline size_t qfind_first_of(const Range & haystack, - const Range & needle); +template +inline size_t qfind_first_of(const Range & haystack, + const Range & needle); /** * Small internal helper - returns the value just before an iterator. @@ -358,6 +359,9 @@ public: Range& operator=(const Range& rhs) & = default; Range& operator=(Range&& rhs) & = default; + template ::const_type = 0> + Range& operator=(std::string&& rhs) = delete; + void clear() { b_ = Iter(); e_ = Iter(); @@ -918,8 +922,8 @@ private: template const typename Range::size_type Range::npos = std::string::npos; -template -void swap(Range& lhs, Range& rhs) { +template +void swap(Range& lhs, Range& rhs) { lhs.swap(rhs); } @@ -974,13 +978,13 @@ inline std::ostream& operator<<(std::ostream& os, * Templated comparison operators */ -template -inline bool operator==(const Range& lhs, const Range& rhs) { +template +inline bool operator==(const Range& lhs, const Range& rhs) { return lhs.size() == rhs.size() && lhs.compare(rhs) == 0; } -template -inline bool operator<(const Range& lhs, const Range& rhs) { +template +inline bool operator<(const Range& lhs, const Range& rhs) { return lhs.compare(rhs) < 0; } @@ -1057,9 +1061,9 @@ operator>=(const T& lhs, const U& rhs) { /** * Finds substrings faster than brute force by borrowing from Boyer-Moore */ -template -size_t qfind(const Range& haystack, - const Range& needle, +template +size_t qfind(const Range& haystack, + const Range& needle, Comp eq) { // Don't use std::search, use a Boyer-Moore-like trick by comparing // the last characters first @@ -1125,9 +1129,9 @@ inline size_t qfind_first_byte_of(const StringPiece haystack, } // namespace detail -template -size_t qfind_first_of(const Range & haystack, - const Range & needles, +template +size_t qfind_first_of(const Range & haystack, + const Range & needles, Comp eq) { auto ret = std::find_first_of(haystack.begin(), haystack.end(), needles.begin(), needles.end(), @@ -1156,16 +1160,16 @@ struct AsciiCaseInsensitive { } }; -template -size_t qfind(const Range& haystack, - const typename Range::value_type& needle) { +template +size_t qfind(const Range& haystack, + const typename Range::value_type& needle) { auto pos = std::find(haystack.begin(), haystack.end(), needle); return pos == haystack.end() ? std::string::npos : pos - haystack.data(); } -template -size_t rfind(const Range& haystack, - const typename Range::value_type& needle) { +template +size_t rfind(const Range& haystack, + const typename Range::value_type& needle) { for (auto i = haystack.size(); i-- > 0; ) { if (haystack[i] == needle) { return i; @@ -1222,9 +1226,9 @@ inline size_t rfind(const Range& haystack, return pos == nullptr ? std::string::npos : pos - haystack.data(); } -template -size_t qfind_first_of(const Range& haystack, - const Range& needles) { +template +size_t qfind_first_of(const Range& haystack, + const Range& needles) { return qfind_first_of(haystack, needles, AsciiCaseSensitive()); }