15#ifndef LLVM_SUPPORT_HASHBUILDER_H
16#define LLVM_SUPPORT_HASHBUILDER_H
41 template <
typename HasherT_ = HasherT>
76 template <
typename... ArgTypes>
78 : OptionalHasher(
std::in_place,
std::forward<ArgTypes>(Args)...),
79 Hasher(*OptionalHasher) {}
82 std::optional<HasherT> OptionalHasher;
136template <
typename HasherT, llvm::endianness Endianness>
140 template <
typename... ArgTypes>
145 template <
typename T>
146 std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value,
HashBuilder &>
173 Value.size() *
sizeof(
T)));
175 for (
auto &V :
Value)
205 template <
typename T>
207 decltype(addHash(std::declval<HashBuilder &>(), std::declval<T &>()));
291 template <
typename T>
292 std::enable_if_t<is_detected<HasAddHashT, T>::value &&
296 addHash(*
this,
Value);
300 template <
typename T1,
typename T2>
306 std::apply([
this](
const auto &...Args) { this->
add(Args...); }, Arg);
320 template <
typename... Ts>
322 return (
add(Args), ...);
325 template <
typename ForwardIteratorT>
335 template <
typename ForwardIteratorT>
337 return addRangeElementsImpl(
339 typename std::iterator_traits<ForwardIteratorT>::iterator_category());
342 template <
typename RangeT>
347 template <
typename T>
351 template <
typename T>
352 std::enable_if_t<is_detected<HasByteSwapT, T>::value,
HashBuilder &>
356 sizeof(SwappedValue)));
363 template <
typename ForwardIteratorT>
365 ForwardIteratorT
Last,
366 std::forward_iterator_tag) {
367 using T =
typename std::iterator_traits<ForwardIteratorT>::value_type;
368 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)
Metafunction that determines whether the given type is either an integral type or an enumeration type...
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).