The Gaudi Framework  master (37c0b60a)
Hash.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifndef GAUDIKERNEL_HASH_H
12 #define GAUDIKERNEL_HASH_H 1
13 // ============================================================================
14 // Include files
15 // ============================================================================
16 // STD & STL
17 // ============================================================================
18 #include <cstddef>
19 #include <numeric>
20 // ============================================================================
21 // Boost
22 // ============================================================================
23 #include <boost/functional/hash.hpp>
24 // ============================================================================
25 namespace GaudiUtils {
27  // To enable the generic hash for a user defined class, it is enough to add
28  // few lines to the .cpp files that needs them
29  // @code
30  // #include "GaudiKernel/Hash.h"
31  // class MyType;
32  // namespace GaudiUtils {
33  // template <>
34  // struct Hash<MyType>: public GenericHash<MyType> {};
35  // }
36  // @endcode
37  template <class T>
38  struct GenericHash {
39  // ========================================================================
41  inline std::size_t operator()( const T& key ) const {
42  const char* p = reinterpret_cast<const char*>( &key );
43  return std::accumulate( p, p + sizeof( T ), std::size_t{ 0 },
44  []( std::size_t res, const char& c ) { return ( res << 1 ) ^ c; } );
45  }
46  // ========================================================================
47  };
48 
49  // ==========================================================================
102  template <class T>
103  struct Hash {
104  // ========================================================================
106  inline std::size_t operator()( const T& key ) const;
107  // ========================================================================
108  };
109  // ==========================================================================
111  template <class T>
112  struct Hash<T*> {
113  // ========================================================================
115  inline std::size_t operator()( const T* key ) const;
116  // ========================================================================
117  };
118  // ==========================================================================
120  template <class T, unsigned N>
121  struct Hash<T ( & )[N]> {
122  // ========================================================================
124  inline std::size_t operator()( T ( &key )[N] ) const { return boost::hash_range( key, key + N ); }
125  // ========================================================================
126  };
128  template <class T, unsigned N>
129  struct Hash<const T ( & )[N]> {
130  // ========================================================================
132  inline std::size_t operator()( const T ( &key )[N] ) const { return boost::hash_range( key, key + N ); }
133  // ========================================================================
134  };
135  // ==========================================================================
137  template <class T>
138  struct Hash<const T> : public Hash<T> {};
140  template <class T>
141  struct Hash<const T*> : public Hash<T*> {};
143  template <class T>
144  struct Hash<T&> : public Hash<T> {};
146  template <class T>
147  struct Hash<const T&> : public Hash<T> {};
148  // ==========================================================================
150  template <class T>
151  inline std::size_t Hash<T>::operator()( const T& key ) const {
152  using namespace boost;
153  return hash_value( key );
154  }
156  template <class T>
157  inline std::size_t Hash<T*>::operator()( const T* key ) const {
158  using namespace boost;
159  return hash_value( key );
160  }
162  template <>
163  inline std::size_t Hash<char*>::operator()( const char* key ) const {
164  std::size_t seed = 0;
165  while ( key ) {
166  boost::hash_combine( seed, *key );
167  ++key;
168  }
169  return seed;
170  }
171 
172  // ==========================================================================
173 } // end of namespace GaudiUtils
174 // ============================================================================
175 // The END
176 // ============================================================================
177 #endif // GAUDIKERNEL_HASH_H
GaudiUtils::GenericHash
Generic hash implementation (for easy migration to the new Hash class).
Definition: Hash.h:38
IOTest.N
N
Definition: IOTest.py:112
gaudirun.c
c
Definition: gaudirun.py:525
GaudiUtils::GenericHash::operator()
std::size_t operator()(const T &key) const
the generic hash function
Definition: Hash.h:41
GaudiUtils::Hash< T * >
the partial specialization for pointers
Definition: Hash.h:112
GaudiUtils::Hash::operator()
std::size_t operator()(const T &key) const
the hash-function
Definition: Hash.h:151
std::accumulate
T accumulate(T... args)
GaudiUtils::Hash< const T(&)[N]>::operator()
std::size_t operator()(const T(&key)[N]) const
the hash-function
Definition: Hash.h:132
Gaudi::hash_value
std::size_t hash_value(const Gaudi::StringKey &key)
hash-function: heeded for boost::hash
Definition: StringKey.h:174
GaudiUtils::Hash
Definition: Hash.h:103
OffloadAtlasMCRecoScenario.seed
seed
Definition: OffloadAtlasMCRecoScenario.py:52
GaudiUtils::Hash< T(&)[N]>::operator()
std::size_t operator()(T(&key)[N]) const
the hash-function
Definition: Hash.h:124
std::size_t
GaudiUtils
Definition: Allocator.h:72
ProduceConsume.key
key
Definition: ProduceConsume.py:84