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)

Declared at: llvm/include/llvm/Support/HashBuilder.h:98

Parameters

HasherT& Hasher

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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...>)

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)

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