class HashBuilderImpl
Declaration
template <typename HasherT, support::endianness Endianness>
class HashBuilderImpl { /* full declaration omitted */ };
Description
Implementation of the `HashBuilder` interface. `support::endianness::native` is not supported. `HashBuilder` is expected to canonicalize `support::endianness::native` to one of `support::endianness::big` or `support::endianness::little`.
Declared at: llvm/include/llvm/Support/HashBuilder.h:93
Templates
- HasherT
- support::endianness Endianness
Method Overview
- public HashBuilderImpl<HasherT, Endianness>(HasherT & Hasher)
- public template <typename... ArgTypes> HashBuilderImpl<HasherT, Endianness>(ArgTypes &&... Args)
- public HashBuilderImpl<HasherT, Endianness> & add(llvm::StringRef Value)
- public template <typename T, typename... Ts>typename std::enable_if<(sizeof...(Ts) >= 1), HashBuilderImpl<HasherT, Endianness> &>::type add(const T & FirstArg, const Ts &... Args)
- public template <typename... Ts>HashBuilderImpl<HasherT, Endianness> & add(const std::tuple<Ts...> & Arg)
- public template <typename T1, typename T2>HashBuilderImpl<HasherT, Endianness> & add(const std::pair<T1, T2> & Value)
- public template <typename T>std::enable_if_t<is_detected<HasAddHashT, T>::value && !hashbuilder_detail::IsHashableData<T>::value, HashBuilderImpl<HasherT, Endianness> &> add(const T & Value)
- public template <typename T>HashBuilderImpl<HasherT, Endianness> & add(ArrayRef<T> Value)
- public template <typename T>std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value, HashBuilderImpl<HasherT, Endianness> &> add(T Value)
- public template <typename ForwardIteratorT>HashBuilderImpl<HasherT, Endianness> & addRange(ForwardIteratorT First, ForwardIteratorT Last)
- public template <typename RangeT>HashBuilderImpl<HasherT, Endianness> & addRange(const RangeT & Range)
- public template <typename ForwardIteratorT>HashBuilderImpl<HasherT, Endianness> & addRangeElements(ForwardIteratorT First, ForwardIteratorT Last)
- public template <typename RangeT>HashBuilderImpl<HasherT, Endianness> & addRangeElements(const RangeT & Range)
- private template <typename ForwardIteratorT>HashBuilderImpl<HasherT, Endianness> & addRangeElementsImpl(ForwardIteratorT First, ForwardIteratorT Last, std::forward_iterator_tag)
- private template <typename T>std::enable_if_t<hashbuilder_detail::IsHashableData<T>::value && Endianness == support::endian::system_endianness(), HashBuilderImpl<HasherT, Endianness> &> addRangeElementsImpl(T * First, T * Last, std::forward_iterator_tag)
- private template <typename... Ts, std::size_t... Indices>HashBuilderImpl<HasherT, Endianness> & addTupleHelper(const std::tuple<Ts...> & Arg, std::index_sequence<Indices...>)
- public template <typename T>std::enable_if_t<is_detected<HasByteSwapT, T>::value, HashBuilderImpl<HasherT, Endianness> &> adjustForEndiannessAndAdd(const T & Value)
Methods
¶HashBuilderImpl<HasherT, Endianness>(
HasherT& Hasher)
HashBuilderImpl<HasherT, Endianness>(
HasherT& Hasher)
Declared at: llvm/include/llvm/Support/HashBuilder.h:98
Parameters
- HasherT& Hasher
¶template <typename... ArgTypes>
HashBuilderImpl<HasherT, Endianness>(
ArgTypes&&... Args)
template <typename... ArgTypes>
HashBuilderImpl<HasherT, Endianness>(
ArgTypes&&... Args)
Declared at: llvm/include/llvm/Support/HashBuilder.h:101
Templates
- ArgTypes
Parameters
- ArgTypes&&... Args
¶HashBuilderImpl<HasherT, Endianness>& add(
llvm::StringRef Value)
HashBuilderImpl<HasherT, Endianness>& add(
llvm::StringRef Value)
Description
Support hashing `StringRef`. `Value.size()` is taken into account to ensure cases like ``` builder.add("a"); builder.add("bc"); ``` and ``` builder.add("ab"); builder.add("c"); ``` do not collide.
Declared at: llvm/include/llvm/Support/HashBuilder.h:156
Parameters
- llvm::StringRef Value
¶template <typename T, typename... Ts>
typename std::enable_if<
(sizeof...(Ts) >= 1),
HashBuilderImpl<HasherT, Endianness>&>::type
add(const T& FirstArg, const Ts&... Args)
template <typename T, typename... Ts>
typename std::enable_if<
(sizeof...(Ts) >= 1),
HashBuilderImpl<HasherT, Endianness>&>::type
add(const T& FirstArg, const Ts&... Args)
Description
A convenenience variadic helper. It simply iterates over its arguments, in order. ``` add(Arg1, Arg2); ``` is equivalent to ``` add(Arg1) add(Arg2) ```
Declared at: llvm/include/llvm/Support/HashBuilder.h:285
Templates
- T
- Ts
Parameters
- const T& FirstArg
- const Ts&... Args
¶template <typename... Ts>
HashBuilderImpl<HasherT, Endianness>& add(
const std::tuple<Ts...>& Arg)
template <typename... Ts>
HashBuilderImpl<HasherT, Endianness>& add(
const std::tuple<Ts...>& Arg)
Declared at: llvm/include/llvm/Support/HashBuilder.h:269
Templates
- Ts
Parameters
- const std::tuple<Ts...>& Arg
¶template <typename T1, typename T2>
HashBuilderImpl<HasherT, Endianness>& add(
const std::pair<T1, T2>& Value)
template <typename T1, typename T2>
HashBuilderImpl<HasherT, Endianness>& add(
const std::pair<T1, T2>& Value)
Declared at: llvm/include/llvm/Support/HashBuilder.h:263
Templates
- T1
- T2
Parameters
- const std::pair<T1, T2>& Value
¶template <typename T>
std::enable_if_t<
is_detected<HasAddHashT, T>::value &&
!hashbuilder_detail::IsHashableData<
T>::value,
HashBuilderImpl<HasherT, Endianness>&>
add(const T& Value)
template <typename T>
std::enable_if_t<
is_detected<HasAddHashT, T>::value &&
!hashbuilder_detail::IsHashableData<
T>::value,
HashBuilderImpl<HasherT, Endianness>&>
add(const T& Value)
Description
Implement hashing for user-defined `struct`s. Any user-define `struct` can participate in hashing via `HashBuilder` by providing a `addHash` templated function. ``` template <typename HasherT, support::endianness Endianness> void addHash(HashBuilder <HasherT , Endianness> &HBuilder , const UserDefinedStruct &Value ); ``` For example: ``` struct SimpleStruct { char c; int i; }; template <typename HasherT, support::endianness Endianness> void addHash(HashBuilderImpl <HasherT , Endianness> &HBuilder , const SimpleStruct &Value ) { HBuilder.add(Value.c); HBuilder.add(Value.i); } ``` To avoid endianness issues, specializations of `addHash` should generally rely on exising `add`, `addRange`, and `addRangeElements` functions. If directly using `update`, an implementation must correctly handle endianness. ``` struct __attribute__ ((packed)) StructWithFastHash { int I; char C; // If possible, we want to hash both `I` and `C` in a single // `update` call for performance concerns. template <typename HasherT, support::endianness Endianness> friend void addHash(HashBuilderImpl <HasherT , Endianness> &HBuilder , const StructWithFastHash &Value ) { if (Endianness == support::endian::system_endianness()) { HBuilder.update(makeArrayRef( reinterpret_cast <const uint8_t *>( &Value ), sizeof(Value))); } else { // Rely on existing `add` methods to handle endianness. HBuilder.add(Value.I); HBuilder.add(Value.C); } } }; ``` To avoid collisions, specialization of `addHash` for variable-size types must take the size into account. For example: ``` struct CustomContainer { private: size_t Size; int Elements[100]; public: CustomContainer(size_t Size) : Size(Size) { for (size_t I = 0; I != Size; ++I) Elements[I] = I; } template <typename HasherT, support::endianness Endianness> friend void addHash(HashBuilderImpl <HasherT , Endianness> &HBuilder , const CustomContainer &Value ) { if (Endianness == support::endian::system_endianness()) { HBuilder.update(makeArrayRef( reinterpret_cast <const uint8_t *>( &Value .Size), sizeof(Value.Size) + Value.Size * sizeof(Value.Elements[0]))); } else { // `addRange` will take care of encoding the size. HBuilder.addRange( &Value .Elements[0], &Value .Elements[0] + Value.Size); } } }; ```
Declared at: llvm/include/llvm/Support/HashBuilder.h:257
Templates
- T
Parameters
- const T& Value
¶template <typename T>
HashBuilderImpl<HasherT, Endianness>& add(
ArrayRef<T> Value)
template <typename T>
HashBuilderImpl<HasherT, Endianness>& add(
ArrayRef<T> Value)
Description
Support hashing `ArrayRef`. `Value.size()` is taken into account to ensure cases like ``` builder.add({1}); builder.add({2, 3}); ``` and ``` builder.add({1, 2}); builder.add({3}); ``` do not collide.
Declared at: llvm/include/llvm/Support/HashBuilder.h:125
Templates
- T
Parameters
- ArrayRef<T> Value
¶template <typename T>
std::enable_if_t<
hashbuilder_detail::IsHashableData<T>::value,
HashBuilderImpl<HasherT, Endianness>&>
add(T Value)
template <typename T>
std::enable_if_t<
hashbuilder_detail::IsHashableData<T>::value,
HashBuilderImpl<HasherT, Endianness>&>
add(T Value)
Description
Implement hashing for hashable data types, e.g. integral or enum values.
Declared at: llvm/include/llvm/Support/HashBuilder.h:108
Templates
- T
Parameters
- T Value
¶template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>& addRange(
ForwardIteratorT First,
ForwardIteratorT Last)
template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>& addRange(
ForwardIteratorT First,
ForwardIteratorT Last)
Declared at: llvm/include/llvm/Support/HashBuilder.h:292
Templates
- ForwardIteratorT
Parameters
- ForwardIteratorT First
- ForwardIteratorT Last
¶template <typename RangeT>
HashBuilderImpl<HasherT, Endianness>& addRange(
const RangeT& Range)
template <typename RangeT>
HashBuilderImpl<HasherT, Endianness>& addRange(
const RangeT& Range)
Declared at: llvm/include/llvm/Support/HashBuilder.h:297
Templates
- RangeT
Parameters
- const RangeT& Range
¶template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElements(ForwardIteratorT First,
ForwardIteratorT Last)
template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElements(ForwardIteratorT First,
ForwardIteratorT Last)
Declared at: llvm/include/llvm/Support/HashBuilder.h:302
Templates
- ForwardIteratorT
Parameters
- ForwardIteratorT First
- ForwardIteratorT Last
¶template <typename RangeT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElements(const RangeT& Range)
template <typename RangeT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElements(const RangeT& Range)
Declared at: llvm/include/llvm/Support/HashBuilder.h:310
Templates
- RangeT
Parameters
- const RangeT& Range
¶template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElementsImpl(ForwardIteratorT First,
ForwardIteratorT Last,
std::forward_iterator_tag)
template <typename ForwardIteratorT>
HashBuilderImpl<HasherT, Endianness>&
addRangeElementsImpl(ForwardIteratorT First,
ForwardIteratorT Last,
std::forward_iterator_tag)
Declared at: llvm/include/llvm/Support/HashBuilder.h:338
Templates
- ForwardIteratorT
Parameters
- ForwardIteratorT First
- ForwardIteratorT Last
- std::forward_iterator_tag
¶template <typename T>
std::enable_if_t<
hashbuilder_detail::IsHashableData<
T>::value &&
Endianness ==
support::endian::system_endianness(),
HashBuilderImpl<HasherT, Endianness>&>
addRangeElementsImpl(T* First,
T* Last,
std::forward_iterator_tag)
template <typename T>
std::enable_if_t<
hashbuilder_detail::IsHashableData<
T>::value &&
Endianness ==
support::endian::system_endianness(),
HashBuilderImpl<HasherT, Endianness>&>
addRangeElementsImpl(T* First,
T* Last,
std::forward_iterator_tag)
Declared at: llvm/include/llvm/Support/HashBuilder.h:350
Templates
- T
Parameters
- T* First
- T* Last
- std::forward_iterator_tag
¶template <typename... Ts, std::size_t... Indices>
HashBuilderImpl<HasherT, Endianness>&
addTupleHelper(const std::tuple<Ts...>& Arg,
std::index_sequence<Indices...>)
template <typename... Ts, std::size_t... Indices>
HashBuilderImpl<HasherT, Endianness>&
addTupleHelper(const std::tuple<Ts...>& Arg,
std::index_sequence<Indices...>)
Declared at: llvm/include/llvm/Support/HashBuilder.h:329
Templates
- Ts
- std::size_t Indices
Parameters
- const std::tuple<Ts...>& Arg
- std::index_sequence<Indices...>
¶template <typename T>
std::enable_if_t<
is_detected<HasByteSwapT, T>::value,
HashBuilderImpl<HasherT, Endianness>&>
adjustForEndiannessAndAdd(const T& Value)
template <typename T>
std::enable_if_t<
is_detected<HasByteSwapT, T>::value,
HashBuilderImpl<HasherT, Endianness>&>
adjustForEndiannessAndAdd(const T& Value)
Description
Adjust `Value` for the target endianness and add it to the hash.
Declared at: llvm/include/llvm/Support/HashBuilder.h:320
Templates
- T
Parameters
- const T& Value