VTK  9.3.20240416
vtkStringToken.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
3 #ifndef vtkStringToken_h
4 #define vtkStringToken_h
26 #include <token/Token.h>
27 
28 #include "vtkCompiler.h" // for VTK_COMPILER_GCC
29 #include "vtkSmartPointer.h" // for ivar
30 
31 #include <cstdint> // for `std::uint*_t`
32 #include <unordered_set> // for membership API
33 
34 // GCC 4.8.5 requires a space between the quotes and suffix operator.
35 // Whereas, C++23 deprecates the space here though.
36 #ifdef VTK_COMPILER_GCC
37 #if VTK_COMPILER_GCC_VERSION <= 40805
38 #define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 1
39 #else
40 #define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 0
41 #endif
42 #else
43 #define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 0
44 #endif
45 
46 VTK_ABI_NAMESPACE_BEGIN
47 
48 class VTKCOMMONCORE_EXPORT vtkStringToken
49 {
50 public:
51  using Hash = std::uint32_t;
52 
54  VTK_WRAPEXCLUDE vtkStringToken(const char* data = nullptr, std::size_t size = std::string::npos);
59  inline constexpr vtkStringToken(Hash tokenId) noexcept
60  : Id(tokenId)
61  {
62  }
63 
65  Hash GetId() const { return this->Id; }
67  unsigned int GetHash() const { return static_cast<unsigned int>(this->Id); }
69  const std::string& Data() const;
70 
74  bool IsValid() const;
76  bool HasData() const;
77 
79  bool operator==(const vtkStringToken& other) const;
81  bool operator!=(const vtkStringToken& other) const;
82 
84  bool operator<(const vtkStringToken& other) const;
85  bool operator>(const vtkStringToken& other) const;
86  bool operator<=(const vtkStringToken& other) const;
87  bool operator>=(const vtkStringToken& other) const;
88 
91  inline static constexpr Hash StringHash(const char* data, std::size_t size) noexcept
92  {
93  return token_NAMESPACE::Token::stringHash(data, size);
94  }
95 
97  static Hash InvalidHash();
98 
114  bool AddChild(vtkStringToken member);
120  std::unordered_set<vtkStringToken> Children(bool recursive = true);
122  static std::unordered_set<vtkStringToken> AllGroups();
124 
125 protected:
127 };
128 VTK_ABI_NAMESPACE_END
129 
130 namespace vtk
131 {
132 namespace literals
133 {
134 VTK_ABI_NAMESPACE_BEGIN
135 
156 #if VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
157 inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken::Hash operator"" _hash(
158  const char* data, std::size_t size)
159 #else
160 inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken::Hash operator""_hash(
161  const char* data, std::size_t size)
162 #endif
163 {
165 }
166 
176 #if VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
177 inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken operator"" _token(
178  const char* data, std::size_t size)
179 #else
180 inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken operator""_token(
181  const char* data, std::size_t size)
182 #endif
183 {
185 }
186 
187 VTK_ABI_NAMESPACE_END
188 } // namespace literals
189 } // namespace vtk
190 
191 VTK_ABI_NAMESPACE_BEGIN
192 bool VTKCOMMONCORE_EXPORT operator==(const std::string& a, const vtkStringToken& b);
193 bool VTKCOMMONCORE_EXPORT operator!=(const std::string& a, const vtkStringToken& b);
194 bool VTKCOMMONCORE_EXPORT operator>(const std::string& a, const vtkStringToken& b);
195 bool VTKCOMMONCORE_EXPORT operator<(const std::string& a, const vtkStringToken& b);
196 bool VTKCOMMONCORE_EXPORT operator>=(const std::string& a, const vtkStringToken& b);
197 bool VTKCOMMONCORE_EXPORT operator<=(const std::string& a, const vtkStringToken& b);
198 
199 bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const std::string& b);
200 bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const std::string& b);
201 bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const std::string& b);
202 bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const std::string& b);
203 bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const std::string& b);
204 bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const std::string& b);
205 
206 bool VTKCOMMONCORE_EXPORT operator==(const char* a, const vtkStringToken& b);
207 bool VTKCOMMONCORE_EXPORT operator!=(const char* a, const vtkStringToken& b);
208 bool VTKCOMMONCORE_EXPORT operator>(const char* a, const vtkStringToken& b);
209 bool VTKCOMMONCORE_EXPORT operator<(const char* a, const vtkStringToken& b);
210 bool VTKCOMMONCORE_EXPORT operator>=(const char* a, const vtkStringToken& b);
211 bool VTKCOMMONCORE_EXPORT operator<=(const char* a, const vtkStringToken& b);
212 
213 bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const char* b);
214 bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const char* b);
215 bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const char* b);
216 bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const char* b);
217 bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const char* b);
218 bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const char* b);
219 VTK_ABI_NAMESPACE_END
220 
221 namespace std
222 {
225 template <>
226 struct VTKCOMMONCORE_EXPORT hash<vtkStringToken>
227 {
228  std::size_t operator()(const vtkStringToken& t) const { return t.GetId(); }
229 };
230 } // namespace std
231 
232 #undef VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
233 #endif // vtkStringToken_h
Represent a string by its integer hash.
bool operator<=(const vtkStringToken &other) const
bool operator<(const vtkStringToken &other) const
Slow, but unsurprising string comparison (preserves lexical string ordering).
static std::unordered_set< vtkStringToken > AllGroups()
Return all the tokens that have children.
static constexpr Hash StringHash(const char *data, std::size_t size) noexcept
Return the hash of a string This is used internally but also by the ""_token() literal operator.
constexpr vtkStringToken(Hash tokenId) noexcept
Construct a token given its hash value.
VTK_WRAPEXCLUDE vtkStringToken(const char *data=nullptr, std::size_t size=std::string::npos)
Construct a token from a string literal.
bool IsValid() const
Return whether the token is valid or not.
bool HasData() const
Return whether a string is available for the token's hash ID.
bool operator!=(const vtkStringToken &other) const
Fast inequality comparison (compares hashes, not strings).
bool AddChild(vtkStringToken member)
Methods to manage groups of tokens underneath a parent.
std::uint32_t Hash
const std::string & Data() const
Return the string corresponding to the token.
bool operator>=(const vtkStringToken &other) const
bool RemoveChild(vtkStringToken member)
Remove a member from this token's children.
vtkStringToken(const std::string &data)
Construct a token from a std::string.
Hash GetId() const
Return the token's ID (usually its hash but possibly not in the case of collisions).
bool operator>(const vtkStringToken &other) const
bool operator==(const vtkStringToken &other) const
Fast equality comparison (compares hashes, not strings).
unsigned int GetHash() const
A Python-wrappable (but less strongly typed) alternative to GetId()
static Hash InvalidHash()
Return the hash code used to indicate an invalid (empty) token.
std::unordered_set< vtkStringToken > Children(bool recursive=true)
Return all the children of this token.
@ size
Definition: vtkX3D.h:253
@ data
Definition: vtkX3D.h:315
@ string
Definition: vtkX3D.h:490
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
std::size_t operator()(const vtkStringToken &t) const
bool VTKCOMMONCORE_EXPORT operator>=(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator==(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator>(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator<=(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator<(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator!=(const std::string &a, const vtkStringToken &b)
#define VTK_WRAPEXCLUDE