15#ifndef LLVM_SUPPORT_HASHBUILDER_H
16#define LLVM_SUPPORT_HASHBUILDER_H
31namespace hashbuilder_detail {
36 : std::integral_constant<bool, is_integral_or_enum<U>::value> {};
43 template <
typename HasherT_ = HasherT>
78 template <
typename... ArgTypes>
80 : OptionalHasher(
std::in_place,
std::forward<ArgTypes>(Args)...),
81 Hasher(*OptionalHasher) {}
84 std::optional<HasherT> OptionalHasher;
93template <
typename HasherT, support::endianness Endianness>
95 static_assert(Endianness != support::endianness::native,
96 "HashBuilder should canonicalize endianness");
101 template <
typename... ArgTypes>
106 template <
typename T>
107 std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value,
135 Value.size() *
sizeof(
T)));
137 for (
auto &V :
Value)
167 template <
typename T>
169 decltype(addHash(std::declval<HashBuilderImpl &>(), std::declval<T &>()));
253 template <
typename T>
254 std::enable_if_t<is_detected<HasAddHashT, T>::value &&
258 addHash(*
this,
Value);
262 template <
typename T1,
typename T2>
268 std::apply([
this](
const auto &...Args) { this->
add(Args...); }, Arg);
282 template <
typename... Ts>
285 return (
add(Args), ...);
288 template <
typename ForwardIteratorT>
298 template <
typename ForwardIteratorT>
300 ForwardIteratorT
Last) {
301 return addRangeElementsImpl(
303 typename std::iterator_traits<ForwardIteratorT>::iterator_category());
306 template <
typename RangeT>
311 template <
typename T>
313 std::declval<T &>(), support::endianness::little));
315 template <
typename T>
316 std::enable_if_t<is_detected<HasByteSwapT, T>::value,
HashBuilderImpl &>
319 this->
update(
ArrayRef(
reinterpret_cast<const uint8_t *
>(&SwappedValue),
320 sizeof(SwappedValue)));
327 template <
typename ForwardIteratorT>
329 ForwardIteratorT
Last,
330 std::forward_iterator_tag) {
336 template <
typename T>
337 std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value &&
340 addRangeElementsImpl(
T *
First,
T *
Last, std::forward_iterator_tag) {
341 this->
update(ArrayRef(
reinterpret_cast<const uint8_t *
>(
First),
397template <
class HasherT, support::endianness Endianness>
403namespace hashbuilder_detail {
415 support::endianness::native>;
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Declares the hasher member, and functions forwarding directly to the hasher.
void update(StringRef Data)
Forward to HasherT::update(ArrayRef<uint8_t>).
HashResultTy< HasherT_ > result()
Forward to HasherT::result() if available.
HashBuilderBase(HasherT &Hasher)
HashBuilderBase(ArgTypes &&...Args)
decltype(std::declval< HasherT_ & >().final()) HashResultTy
void update(ArrayRef< uint8_t > Data)
Forward to HasherT::update(ArrayRef<uint8_t>).
Implementation of the HashBuilder interface.
HashBuilderImpl(ArgTypes &&...Args)
std::enable_if_t<(sizeof...(Ts) > 1), HashBuilderImpl & > add(const Ts &...Args)
A convenenience variadic helper.
std::enable_if_t< hashbuilder_detail::IsHashableData< T >::value, HashBuilderImpl & > add(T Value)
Implement hashing for hashable data types, e.g. integral or enum values.
decltype(addHash(std::declval< HashBuilderImpl & >(), std::declval< T & >())) HasAddHashT
HashBuilderImpl & addRange(ForwardIteratorT First, ForwardIteratorT Last)
HashBuilderImpl & add(StringRef Value)
Support hashing StringRef.
HashBuilderImpl & add(const std::pair< T1, T2 > &Value)
std::enable_if_t< is_detected< HasByteSwapT, T >::value, HashBuilderImpl & > adjustForEndiannessAndAdd(const T &Value)
Adjust Value for the target endianness and add it to the hash.
HashBuilderImpl & add(const std::tuple< Ts... > &Arg)
HashBuilderImpl & addRangeElements(ForwardIteratorT First, ForwardIteratorT Last)
HashBuilderImpl(HasherT &Hasher)
HashBuilderImpl & addRange(const RangeT &Range)
decltype(support::endian::byte_swap(std::declval< T & >(), support::endianness::little)) HasByteSwapT
HashBuilderImpl & addRangeElements(const RangeT &Range)
HashBuilderImpl & add(ArrayRef< T > Value)
Support hashing ArrayRef.
std::enable_if_t< is_detected< HasAddHashT, T >::value &&!hashbuilder_detail::IsHashableData< T >::value, HashBuilderImpl & > add(const T &Value)
Implement hashing for user-defined structs.
StringRef - Represent a constant reference to a string, i.e.
LLVM Value Representation.
An opaque object representing a hash code.
void update(ArrayRef< uint8_t > Data)
value_type byte_swap(value_type value, endianness endian)
constexpr endianness system_endianness()
This is an optimization pass for GlobalISel generic memory operations.
hash_code hash_value(const FixedPointSemantics &Val)
constexpr auto adl_begin(RangeT &&range) -> decltype(adl_detail::begin_impl(std::forward< RangeT >(range)))
Returns the begin iterator to range using std::begin and function found through Argument-Dependent Lo...
constexpr auto adl_end(RangeT &&range) -> decltype(adl_detail::end_impl(std::forward< RangeT >(range)))
Returns the end iterator to range using std::end and functions found through Argument-Dependent Looku...
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Implement std::hash so that hash_code can be used in STL containers.
Trait to indicate whether a type's bits can be hashed directly (after endianness correction).