The Gaudi Framework  master (37c0b60a)
StringKey.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_STRINGKEY_H
12 #define GAUDIKERNEL_STRINGKEY_H 1
13 // ============================================================================
14 // Include files
15 // ============================================================================
16 // STD & STL
17 // ============================================================================
18 #include <algorithm>
19 #include <functional>
20 #include <iosfwd>
21 #include <string>
22 #include <vector>
23 // ============================================================================
24 // GaudiKernel
25 // ============================================================================
26 #include <GaudiKernel/Kernel.h>
27 #include <GaudiKernel/StatusCode.h>
28 // ============================================================================
29 namespace Gaudi {
30  // ==========================================================================
45  public:
46  // ========================================================================
48  StringKey( const char* key = "" ) : StringKey{ std::string{ key } } {}
49  //
51  StringKey( std::string key ); // constructor, perform hashing
52  // ========================================================================
53  public:
54  // ========================================================================
56  const std::string& str() const { return m_str; }
58  operator const std::string&() const { return str(); }
60  bool empty() const { return m_str.empty(); }
62  bool operator!() const { return empty(); }
63  // ========================================================================
64  public:
65  // ========================================================================
69  friend bool operator==( const StringKey& lhs, const StringKey& rhs ) {
70  return lhs.m_hash == rhs.m_hash && lhs.m_str == rhs.m_str;
71  }
75  friend bool operator==( const StringKey& lhs, const std::string& rhs ) { return lhs.m_str == rhs; }
76  friend bool operator==( const std::string& lhs, const StringKey& rhs ) { return rhs == lhs; }
77  friend bool operator==( const StringKey& lhs, std::string_view rhs ) { return lhs.m_str == rhs; }
78  friend bool operator==( std::string_view lhs, const StringKey& rhs ) { return rhs == lhs; }
79  // ========================================================================
80  public: // non-equality
81  // ========================================================================
83  friend bool operator!=( const StringKey& lhs, const StringKey& rhs ) { return !( lhs == rhs ); }
85  friend bool operator!=( const StringKey& lhs, std::string_view rhs ) { return !( lhs == rhs ); }
86  friend bool operator!=( const StringKey& lhs, const std::string& rhs ) { return !( lhs == rhs ); }
87  friend bool operator!=( std::string_view lhs, const StringKey& rhs ) { return !( lhs == rhs ); }
88  friend bool operator!=( const std::string& lhs, const StringKey& rhs ) { return !( lhs == rhs ); }
89  // ========================================================================
90  // ordering
91  // ========================================================================
92  public:
113  friend bool operator<( const StringKey& lhs, const StringKey& rhs ) {
114  return lhs.m_hash == rhs.m_hash ? lhs.m_str < rhs.m_str : lhs.m_hash < rhs.m_hash;
115  }
117  friend bool operator>( const StringKey& lhs, const StringKey& rhs ) { return rhs < lhs; }
119  friend bool operator<=( const StringKey& lhs, const StringKey& rhs ) { return !( lhs > rhs ); }
121  friend bool operator>=( const StringKey& lhs, const StringKey& rhs ) { return !( lhs < rhs ); }
122  // ========================================================================
123  // few helper methods for indirect usage, mainly for Python
124  // ========================================================================
125  public:
135  std::size_t __hash__() const { return m_hash; }
136  // ========================================================================
138  const std::string& __str__() const; // the representation of the object
140  std::string __repr__() const; // the representation of the object
142  bool __eq__( const StringKey& right ) const;
144  bool __eq__( std::string_view right ) const;
146  bool __neq__( const StringKey& right ) const;
148  bool __neq__( const std::string_view right ) const;
149  // ========================================================================
150  public:
151  // ========================================================================
153  std::string toString() const; // string representation (for properties)
154  // ========================================================================
155  private:
156  // ========================================================================
158  std::string m_str; // the actual string
160  std::size_t m_hash; // the hash
161  // ========================================================================
162  };
163  // ==========================================================================
174  inline std::size_t hash_value( const Gaudi::StringKey& key ) { return key.__hash__(); }
175  // ==========================================================================
176 } // end of namespace Gaudi
177 // interoperability with std::string and const char*
178 inline std::string operator+( const std::string& lhs, const Gaudi::StringKey& rhs ) { return lhs + rhs.str(); }
179 inline std::string operator+( const char* lhs, const Gaudi::StringKey& rhs ) { return lhs + rhs.str(); }
180 inline std::string operator+( const Gaudi::StringKey& lhs, const std::string& rhs ) { return lhs.str() + rhs; }
181 inline std::string operator+( const Gaudi::StringKey& lhs, const char* rhs ) { return lhs.str() + rhs; }
182 // ============================================================================
183 // Streaming value -> string
184 // ============================================================================
185 namespace Gaudi {
186  // ==========================================================================
187  namespace Utils {
188  // ========================================================================
200  // ========================================================================
201  } // namespace Utils
202  // ==========================================================================
208  inline std::ostream& operator<<( std::ostream& o, const Gaudi::StringKey& key ) { return o << key.str(); }
209  // ==========================================================================
210 } // end of namespace Gaudi
211 // ============================================================================
212 // Parsing : string -> value
213 // ============================================================================
214 namespace Gaudi {
215  // ==========================================================================
216  namespace Parsers {
217  // ========================================================================
227  GAUDI_API StatusCode parse( Gaudi::StringKey& result, std::string_view input );
228  // ========================================================================
238  GAUDI_API StatusCode parse( std::vector<Gaudi::StringKey>& result, std::string_view input );
239  // ========================================================================
240  } // namespace Parsers
241  // ==========================================================================
242 } // end of namespace Gaudi
243 // ============================================================================
244 namespace std {
248  template <>
249  struct hash<Gaudi::StringKey> {
250  inline std::size_t operator()( Gaudi::StringKey const& s ) const { return hash_value( s ); }
251  };
252 } // namespace std
253 // ============================================================================
254 #endif // GAUDIKERNEL_STRINGKEY_H
Gaudi::StringKey::operator!=
friend bool operator!=(const StringKey &lhs, const std::string &rhs)
Definition: StringKey.h:86
Gaudi::StringKey::m_str
std::string m_str
the actual string:
Definition: StringKey.h:158
Gaudi::StringKey::operator!=
friend bool operator!=(const std::string &lhs, const StringKey &rhs)
Definition: StringKey.h:88
std::string
STL class.
std::hash< Gaudi::StringKey >::operator()
std::size_t operator()(Gaudi::StringKey const &s) const
Definition: StringKey.h:250
Gaudi::Parsers::parse
StatusCode parse(GaudiUtils::HashMap< K, V > &result, std::string_view input)
Basic parser for the types of HashMap used in DODBasicMapper.
Definition: DODBasicMapper.cpp:21
Gaudi::StringKey::operator!=
friend bool operator!=(const StringKey &lhs, std::string_view rhs)
non-equality string
Definition: StringKey.h:85
gaudirun.s
string s
Definition: gaudirun.py:346
std::vector< Gaudi::StringKey >
Gaudi::StringKey::operator==
friend bool operator==(const StringKey &lhs, const std::string &rhs)
equality, without hashing string rely on the native string equality
Definition: StringKey.h:75
GaudiPartProp.decorators.__repr__
__repr__
decorate the vector of properties
Definition: decorators.py:173
Gaudi::StringKey::operator==
friend bool operator==(std::string_view lhs, const StringKey &rhs)
Definition: StringKey.h:78
Gaudi::StringKey::operator<
friend bool operator<(const StringKey &lhs, const StringKey &rhs)
less key It can be used as a key for std::map, e.g.
Definition: StringKey.h:113
Gaudi::StringKey::operator>
friend bool operator>(const StringKey &lhs, const StringKey &rhs)
greater key
Definition: StringKey.h:117
Gaudi::StringKey::operator==
friend bool operator==(const StringKey &lhs, const StringKey &rhs)
equality Key for efficiency reason compare the hash-values first
Definition: StringKey.h:69
StatusCode.h
Gaudi::StringKey::operator==
friend bool operator==(const StringKey &lhs, std::string_view rhs)
Definition: StringKey.h:77
Gaudi::StringKey::m_hash
std::size_t m_hash
the hash:
Definition: StringKey.h:160
Gaudi::StringKey::operator==
friend bool operator==(const std::string &lhs, const StringKey &rhs)
Definition: StringKey.h:76
Gaudi::StringKey
Definition: StringKey.h:44
Gaudi::StringKey::operator<=
friend bool operator<=(const StringKey &lhs, const StringKey &rhs)
less or equal key
Definition: StringKey.h:119
StatusCode
Definition: StatusCode.h:65
Gaudi::StringKey::StringKey
StringKey(const char *key="")
constructor from plain C-string, perform hashing
Definition: StringKey.h:48
Gaudi::StringKey::operator!
bool operator!() const
empty key?
Definition: StringKey.h:62
std::ostream
STL class.
Gaudi::StringKey::operator>=
friend bool operator>=(const StringKey &lhs, const StringKey &rhs)
greater or equal key
Definition: StringKey.h:121
Gaudi::hash_value
std::size_t hash_value(const Gaudi::StringKey &key)
hash-function: heeded for boost::hash
Definition: StringKey.h:174
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
Gaudi::StringKey::operator!=
friend bool operator!=(const StringKey &lhs, const StringKey &rhs)
non equality Key
Definition: StringKey.h:83
Gaudi::Utils::toString
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
Definition: ToStream.h:353
GaudiPartProp.decorators.__str__
__str__
decorate the printout for Gaudi::ParticleProperty
Definition: decorators.py:176
Gaudi::StringKey::__hash__
std::size_t __hash__() const
the actual access to the hash
Definition: StringKey.h:135
std
STL namespace.
Kernel.h
Gaudi::Utils::toStream
std::ostream & toStream(ITERATOR first, ITERATOR last, std::ostream &s, const std::string &open, const std::string &close, const std::string &delim)
the helper function to print the sequence
Definition: ToStream.h:299
Gaudi::StringKey::str
const std::string & str() const
the actual string
Definition: StringKey.h:56
Gaudi::operator<<
std::ostream & operator<<(std::ostream &o, const Gaudi::StringKey &key)
printout of the object reply on the native printout for the string
Definition: StringKey.h:208
Gaudi::StringKey::operator!=
friend bool operator!=(std::string_view lhs, const StringKey &rhs)
Definition: StringKey.h:87
std::size_t
ProduceConsume.key
key
Definition: ProduceConsume.py:84
Gaudi::StringKey::empty
bool empty() const
empty key?
Definition: StringKey.h:60
GAUDI_API
#define GAUDI_API
Definition: Kernel.h:81
std::hash
operator+
std::string operator+(const std::string &lhs, const Gaudi::StringKey &rhs)
Definition: StringKey.h:178