VTK  9.7.1
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
5 
29 #include <token/Token.h>
30 
31 #include "vtkCompiler.h" // for VTK_COMPILER_GCC
32 #include "vtkSmartPointer.h" // for ivar
33 
34 //clang-format off
35 #include <vtk_nlohmannjson.h>
36 #include VTK_NLOHMANN_JSON(json.hpp)
37 //clang-format on
38 
39 #include <cstdint> // for `std::uint*_t`
40 #include <unordered_set> // for membership API
41 
42 VTK_ABI_NAMESPACE_BEGIN
43 
44 class VTKCOMMONCORE_EXPORT vtkStringToken
45 {
46 public:
47  using Hash = std::uint32_t;
48 
50  VTK_WRAPEXCLUDE vtkStringToken(const char* data = nullptr, std::size_t size = std::string::npos);
55  constexpr vtkStringToken(Hash tokenId) noexcept
56  : Id(tokenId)
57  {
58  }
59 
61  Hash GetId() const { return this->Id; }
63  unsigned int GetHash() const { return static_cast<unsigned int>(this->Id); }
65  const std::string& Data() const;
66 
70  bool IsValid() const;
72  bool HasData() const;
73 
75  bool operator==(const vtkStringToken& other) const;
77  bool operator!=(const vtkStringToken& other) const;
78 
80  bool operator<(const vtkStringToken& other) const;
81  bool operator>(const vtkStringToken& other) const;
82  bool operator<=(const vtkStringToken& other) const;
83  bool operator>=(const vtkStringToken& other) const;
84 
87  static constexpr Hash StringHash(const char* data, std::size_t size) noexcept
88  {
89  return token_NAMESPACE::Token::stringHash(data, size);
90  }
91 
93  static Hash InvalidHash();
94 
110  bool AddChild(vtkStringToken member);
114  bool RemoveChild(vtkStringToken member);
116  std::unordered_set<vtkStringToken> Children(bool recursive = true);
118  static std::unordered_set<vtkStringToken> AllGroups();
120 
121 protected:
123 };
124 
130 inline void from_json(const nlohmann::json& jj, vtkStringToken& tt)
131 {
132  if (jj.is_number_integer())
133  {
134  tt = vtkStringToken(jj.get<vtkStringToken::Hash>());
135  }
136  else if (jj.is_string())
137  {
138  tt = jj.get<std::string>();
139  }
140  else
141  {
142  throw std::runtime_error("String tokens must be JSON integers or strings.");
143  }
144 }
145 
150 inline void to_json(nlohmann::json& jj, const vtkStringToken& tt)
151 {
152  if (tt.HasData())
153  {
154  jj = tt.Data();
155  }
156  else
157  {
158  jj = tt.GetId();
159  }
160 }
161 
162 VTK_ABI_NAMESPACE_END
163 
164 namespace vtk
165 {
166 namespace literals
167 {
168 VTK_ABI_NAMESPACE_BEGIN
169 
190 constexpr VTKCOMMONCORE_EXPORT vtkStringToken::Hash operator""_hash(
191  const char* data, std::size_t size)
192 {
193  return vtkStringToken::StringHash(data, size);
194 }
195 
205 constexpr VTKCOMMONCORE_EXPORT vtkStringToken operator""_token(const char* data, std::size_t size)
206 {
207  return vtkStringToken(vtkStringToken::StringHash(data, size));
208 }
209 
210 VTK_ABI_NAMESPACE_END
211 } // namespace literals
212 } // namespace vtk
213 
214 VTK_ABI_NAMESPACE_BEGIN
215 bool VTKCOMMONCORE_EXPORT operator==(const std::string& a, const vtkStringToken& b);
216 bool VTKCOMMONCORE_EXPORT operator!=(const std::string& a, const vtkStringToken& b);
217 bool VTKCOMMONCORE_EXPORT operator>(const std::string& a, const vtkStringToken& b);
218 bool VTKCOMMONCORE_EXPORT operator<(const std::string& a, const vtkStringToken& b);
219 bool VTKCOMMONCORE_EXPORT operator>=(const std::string& a, const vtkStringToken& b);
220 bool VTKCOMMONCORE_EXPORT operator<=(const std::string& a, const vtkStringToken& b);
221 
222 bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const std::string& b);
223 bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const std::string& b);
224 bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const std::string& b);
225 bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const std::string& b);
226 bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const std::string& b);
227 bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const std::string& b);
228 
229 bool VTKCOMMONCORE_EXPORT operator==(const char* a, const vtkStringToken& b);
230 bool VTKCOMMONCORE_EXPORT operator!=(const char* a, const vtkStringToken& b);
231 bool VTKCOMMONCORE_EXPORT operator>(const char* a, const vtkStringToken& b);
232 bool VTKCOMMONCORE_EXPORT operator<(const char* a, const vtkStringToken& b);
233 bool VTKCOMMONCORE_EXPORT operator>=(const char* a, const vtkStringToken& b);
234 bool VTKCOMMONCORE_EXPORT operator<=(const char* a, const vtkStringToken& b);
235 
236 bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const char* b);
237 bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const char* b);
238 bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const char* b);
239 bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const char* b);
240 bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const char* b);
241 bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const char* b);
242 VTK_ABI_NAMESPACE_END
243 
244 namespace std
245 {
248 template <>
249 struct VTKCOMMONCORE_EXPORT hash<vtkStringToken>
250 {
251  std::size_t operator()(const vtkStringToken& t) const { return t.GetId(); }
252 };
253 } // namespace std
254 
255 #endif // vtkStringToken_h
std::size_t operator()(const vtkStringToken &t) const
void to_json(nlohmann::json &jj, const vtkStringToken &tt)
Convert a string token into a JSON value.
bool VTKCOMMONCORE_EXPORT operator>(const std::string &a, const vtkStringToken &b)
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
bool VTKCOMMONCORE_EXPORT operator==(const std::string &a, const vtkStringToken &b)
Hash GetId() const
Return the token's ID (usually its hash but possibly not in the case of collisions).
std::uint32_t Hash
constexpr vtkStringToken(Hash tokenId) noexcept
Construct a token given its hash value.
bool VTKCOMMONCORE_EXPORT operator!=(const std::string &a, const vtkStringToken &b)
unsigned int GetHash() const
A Python-wrappable (but less strongly typed) alternative to GetId()
bool VTKCOMMONCORE_EXPORT operator<(const std::string &a, const vtkStringToken &b)
void from_json(const nlohmann::json &jj, vtkStringToken &tt)
Convert a JSON value into a string token.
Represent a string by its integer hash.
bool HasData() const
Return whether a string is available for the token's hash ID.
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...
const std::string & Data() const
Return the string corresponding to the token.
#define VTK_WRAPEXCLUDE
bool VTKCOMMONCORE_EXPORT operator>=(const std::string &a, const vtkStringToken &b)
bool VTKCOMMONCORE_EXPORT operator<=(const std::string &a, const vtkStringToken &b)