15#ifndef LLVM_SUPPORT_HASHBUILDER_H
16#define LLVM_SUPPORT_HASHBUILDER_H
42 template <
typename HasherT_ = HasherT>
77 template <
typename... ArgTypes>
79 : OptionalHasher(
std::in_place,
std::forward<ArgTypes>(Args)...),
80 Hasher(*OptionalHasher) {}
83 std::optional<HasherT> OptionalHasher;
137template <
typename HasherT, llvm::endianness Endianness>
141 template <
typename... ArgTypes>
146 template <
typename T>
147 std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value,
HashBuilder &>
174 Value.size() *
sizeof(
T)));
176 for (
auto &V :
Value)
206 template <
typename T>
208 decltype(addHash(std::declval<HashBuilder &>(), std::declval<T &>()));
292 template <
typename T>
293 std::enable_if_t<is_detected<HasAddHashT, T>::value &&
297 addHash(*
this,
Value);
301 template <
typename T1,
typename T2>
307 std::apply([
this](
const auto &...Args) { this->
add(Args...); }, Arg);
321 template <
typename... Ts>
323 return (
add(Args), ...);
326 template <
typename ForwardIteratorT>
336 template <
typename ForwardIteratorT>
338 return addRangeElementsImpl(
340 typename std::iterator_traits<ForwardIteratorT>::iterator_category());
343 template <
typename RangeT>
348 template <
typename T>
352 template <
typename T>
353 std::enable_if_t<is_detected<HasByteSwapT, T>::value,
HashBuilder &>
357 sizeof(SwappedValue)));
364 template <
typename ForwardIteratorT>
366 ForwardIteratorT
Last,
367 std::forward_iterator_tag) {
368 using T =
typename std::iterator_traits<ForwardIteratorT>::value_type;
369 if constexpr (std::is_pointer_v<ForwardIteratorT> &&
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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>).
Interface to help hash various types through a hasher type.
std::enable_if_t< is_detected< HasAddHashT, T >::value &&!hashbuilder_detail::IsHashableData< T >::value, HashBuilder & > add(const T &Value)
Implement hashing for user-defined structs.
HashBuilder & add(StringRef Value)
Support hashing StringRef.
std::enable_if_t< is_detected< HasByteSwapT, T >::value, HashBuilder & > adjustForEndiannessAndAdd(const T &Value)
Adjust Value for the target endianness and add it to the hash.
HashBuilder(HasherT &Hasher)
std::enable_if_t<(sizeof...(Ts) > 1), HashBuilder & > add(const Ts &...Args)
A convenenience variadic helper.
HashBuilder & addRangeElements(const RangeT &Range)
HashBuilder & addRange(const RangeT &Range)
HashBuilder & addRangeElements(ForwardIteratorT First, ForwardIteratorT Last)
decltype(addHash(std::declval< HashBuilder & >(), std::declval< T & >())) HasAddHashT
HashBuilder & add(const std::tuple< Ts... > &Arg)
HashBuilder & add(ArrayRef< T > Value)
Support hashing ArrayRef.
std::enable_if_t< hashbuilder_detail::IsHashableData< T >::value, HashBuilder & > add(T Value)
Implement hashing for hashable data types, e.g. integral or enum values.
HashBuilder & addRange(ForwardIteratorT First, ForwardIteratorT Last)
HashBuilder & add(const std::pair< T1, T2 > &Value)
decltype(support::endian::byte_swap( std::declval< T & >(), llvm::endianness::little)) HasByteSwapT
HashBuilder(ArgTypes &&...Args)
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)
HashBuilder< hashbuilder_detail::HashCodeHasher, llvm::endianness::native > HashCodeHashBuilder
value_type byte_swap(value_type value, endianness endian)
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...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
ArrayRef(const T &OneElt) -> ArrayRef< T >
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
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).