projects
/
folly.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
folly: hash: specialize hash_combine_generic by size_t size
[folly.git]
/
folly
/
Range.h
diff --git
a/folly/Range.h
b/folly/Range.h
index c34d5cfe601efd766d7c43b3181422a02eae4686..8e51760728a6e56817e98bf23d435fe483322672 100644
(file)
--- a/
folly/Range.h
+++ b/
folly/Range.h
@@
-48,6
+48,8
@@
#include <folly/CpuId.h>
#include <folly/Traits.h>
#include <folly/Likely.h>
#include <folly/CpuId.h>
#include <folly/Traits.h>
#include <folly/Likely.h>
+#include <folly/detail/RangeCommon.h>
+#include <folly/detail/RangeSse42.h>
// Ignore shadowing warnings within this file, so includers can use -Wshadow.
#pragma GCC diagnostic push
// Ignore shadowing warnings within this file, so includers can use -Wshadow.
#pragma GCC diagnostic push
@@
-198,15
+200,10
@@
public:
constexpr Range(Iter start, size_t size)
: b_(start), e_(start + size) { }
constexpr Range(Iter start, size_t size)
: b_(start), e_(start + size) { }
-#if FOLLY_HAVE_CONSTEXPR_STRLEN
template <class T = Iter, typename detail::IsCharPointer<T>::type = 0>
constexpr /* implicit */ Range(Iter str)
template <class T = Iter, typename detail::IsCharPointer<T>::type = 0>
constexpr /* implicit */ Range(Iter str)
- : b_(str), e_(str + strlen(str)) {}
-#else
- template <class T = Iter, typename detail::IsCharPointer<T>::type = 0>
- /* implicit */ Range(Iter str)
- : b_(str), e_(str + strlen(str)) {}
-#endif
+ : b_(str), e_(str + constexpr_strlen(str)) {}
+
template <class T = Iter, typename detail::IsCharPointer<T>::const_type = 0>
/* implicit */ Range(const std::string& str)
: b_(str.data()), e_(b_ + str.size()) {}
template <class T = Iter, typename detail::IsCharPointer<T>::const_type = 0>
/* implicit */ Range(const std::string& str)
: b_(str.data()), e_(b_ + str.size()) {}
@@
-1000,13
+997,6
@@
size_t qfind(const Range<T>& haystack,
namespace detail {
namespace detail {
-size_t qfind_first_byte_of_nosse(const StringPiece haystack,
- const StringPiece needles);
-
-#if FOLLY_HAVE_EMMINTRIN_H && __GNUC_PREREQ(4, 6)
-size_t qfind_first_byte_of_sse42(const StringPiece haystack,
- const StringPiece needles);
-
inline size_t qfind_first_byte_of(const StringPiece haystack,
const StringPiece needles) {
static auto const qfind_first_byte_of_fn =
inline size_t qfind_first_byte_of(const StringPiece haystack,
const StringPiece needles) {
static auto const qfind_first_byte_of_fn =
@@
-1015,13
+1005,6
@@
inline size_t qfind_first_byte_of(const StringPiece haystack,
return qfind_first_byte_of_fn(haystack, needles);
}
return qfind_first_byte_of_fn(haystack, needles);
}
-#else
-inline size_t qfind_first_byte_of(const StringPiece haystack,
- const StringPiece needles) {
- return qfind_first_byte_of_nosse(haystack, needles);
-}
-#endif // FOLLY_HAVE_EMMINTRIN_H
-
} // namespace detail
template <class T, class Comp>
} // namespace detail
template <class T, class Comp>
@@
-1055,9
+1038,6
@@
struct AsciiCaseInsensitive {
}
};
}
};
-extern const AsciiCaseSensitive asciiCaseSensitive;
-extern const AsciiCaseInsensitive asciiCaseInsensitive;
-
template <class T>
size_t qfind(const Range<T>& haystack,
const typename Range<T>::value_type& needle) {
template <class T>
size_t qfind(const Range<T>& haystack,
const typename Range<T>::value_type& needle) {
@@
-1115,7
+1095,7
@@
inline size_t rfind(const Range<const unsigned char*>& haystack,
template <class T>
size_t qfind_first_of(const Range<T>& haystack,
const Range<T>& needles) {
template <class T>
size_t qfind_first_of(const Range<T>& haystack,
const Range<T>& needles) {
- return qfind_first_of(haystack, needles,
asciiCaseSensitive
);
+ return qfind_first_of(haystack, needles,
AsciiCaseSensitive()
);
}
// specialization for StringPiece
}
// specialization for StringPiece
@@
-1133,10
+1113,12
@@
inline size_t qfind_first_of(const Range<const unsigned char*>& haystack,
StringPiece(needles));
}
StringPiece(needles));
}
-template<class Key>
+template<class Key
, class Enable
>
struct hasher;
struct hasher;
-template <class T> struct hasher<folly::Range<T*>> {
+template <class T>
+struct hasher<folly::Range<T*>,
+ typename std::enable_if<std::is_pod<T>::value, void>::type> {
size_t operator()(folly::Range<T*> r) const {
return hash::SpookyHashV2::Hash64(r.begin(), r.size() * sizeof(T), 0);
}
size_t operator()(folly::Range<T*> r) const {
return hash::SpookyHashV2::Hash64(r.begin(), r.size() * sizeof(T), 0);
}