VTK  9.4.20250201
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
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// GCC 4.8.5 requires a space between the quotes and suffix operator.
43// Whereas, C++23 deprecates the space here though.
44#ifdef VTK_COMPILER_GCC
45#if VTK_COMPILER_GCC_VERSION <= 40805
46#define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 1
47#else
48#define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 0
49#endif
50#else
51#define VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX 0
52#endif
53
54VTK_ABI_NAMESPACE_BEGIN
55
56class VTKCOMMONCORE_EXPORT vtkStringToken
57{
58public:
59 using Hash = std::uint32_t;
60
62 VTK_WRAPEXCLUDE vtkStringToken(const char* data = nullptr, std::size_t size = std::string::npos);
64 vtkStringToken(const std::string& data);
67 inline constexpr vtkStringToken(Hash tokenId) noexcept
68 : Id(tokenId)
69 {
70 }
71
73 Hash GetId() const { return this->Id; }
75 unsigned int GetHash() const { return static_cast<unsigned int>(this->Id); }
77 const std::string& Data() const;
78
82 bool IsValid() const;
84 bool HasData() const;
85
87 bool operator==(const vtkStringToken& other) const;
89 bool operator!=(const vtkStringToken& other) const;
90
92 bool operator<(const vtkStringToken& other) const;
93 bool operator>(const vtkStringToken& other) const;
94 bool operator<=(const vtkStringToken& other) const;
95 bool operator>=(const vtkStringToken& other) const;
96
99 inline static constexpr Hash StringHash(const char* data, std::size_t size) noexcept
100 {
101 return token_NAMESPACE::Token::stringHash(data, size);
102 }
103
106
128 std::unordered_set<vtkStringToken> Children(bool recursive = true);
130 static std::unordered_set<vtkStringToken> AllGroups();
132
133protected:
135};
136
142inline void VTKCOMMONCORE_EXPORT from_json(const nlohmann::json& jj, vtkStringToken& tt)
143{
144 if (jj.is_number_integer())
145 {
146 tt = vtkStringToken(jj.get<vtkStringToken::Hash>());
147 }
148 else if (jj.is_string())
149 {
150 tt = jj.get<std::string>();
151 }
152 else
153 {
154 throw std::runtime_error("String tokens must be JSON integers or strings.");
155 }
156}
157
162inline void VTKCOMMONCORE_EXPORT to_json(nlohmann::json& jj, const vtkStringToken& tt)
163{
164 if (tt.HasData())
165 {
166 jj = tt.Data();
167 }
168 else
169 {
170 jj = tt.GetId();
171 }
172}
173
174VTK_ABI_NAMESPACE_END
175
176namespace vtk
177{
178namespace literals
179{
180VTK_ABI_NAMESPACE_BEGIN
181
202#if VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
203inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken::Hash operator"" _hash(
204 const char* data, std::size_t size)
205#else
206inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken::Hash operator""_hash(
207 const char* data, std::size_t size)
208#endif
209{
210 return vtkStringToken::StringHash(data, size);
211}
212
222#if VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
223inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken operator"" _token(
224 const char* data, std::size_t size)
225#else
226inline constexpr VTKCOMMONCORE_EXPORT vtkStringToken operator""_token(
227 const char* data, std::size_t size)
228#endif
229{
230 return vtkStringToken(vtkStringToken::StringHash(data, size));
231}
232
233VTK_ABI_NAMESPACE_END
234} // namespace literals
235} // namespace vtk
236
237VTK_ABI_NAMESPACE_BEGIN
238bool VTKCOMMONCORE_EXPORT operator==(const std::string& a, const vtkStringToken& b);
239bool VTKCOMMONCORE_EXPORT operator!=(const std::string& a, const vtkStringToken& b);
240bool VTKCOMMONCORE_EXPORT operator>(const std::string& a, const vtkStringToken& b);
241bool VTKCOMMONCORE_EXPORT operator<(const std::string& a, const vtkStringToken& b);
242bool VTKCOMMONCORE_EXPORT operator>=(const std::string& a, const vtkStringToken& b);
243bool VTKCOMMONCORE_EXPORT operator<=(const std::string& a, const vtkStringToken& b);
244
245bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const std::string& b);
246bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const std::string& b);
247bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const std::string& b);
248bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const std::string& b);
249bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const std::string& b);
250bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const std::string& b);
251
252bool VTKCOMMONCORE_EXPORT operator==(const char* a, const vtkStringToken& b);
253bool VTKCOMMONCORE_EXPORT operator!=(const char* a, const vtkStringToken& b);
254bool VTKCOMMONCORE_EXPORT operator>(const char* a, const vtkStringToken& b);
255bool VTKCOMMONCORE_EXPORT operator<(const char* a, const vtkStringToken& b);
256bool VTKCOMMONCORE_EXPORT operator>=(const char* a, const vtkStringToken& b);
257bool VTKCOMMONCORE_EXPORT operator<=(const char* a, const vtkStringToken& b);
258
259bool VTKCOMMONCORE_EXPORT operator==(const vtkStringToken& a, const char* b);
260bool VTKCOMMONCORE_EXPORT operator!=(const vtkStringToken& a, const char* b);
261bool VTKCOMMONCORE_EXPORT operator>(const vtkStringToken& a, const char* b);
262bool VTKCOMMONCORE_EXPORT operator<(const vtkStringToken& a, const char* b);
263bool VTKCOMMONCORE_EXPORT operator>=(const vtkStringToken& a, const char* b);
264bool VTKCOMMONCORE_EXPORT operator<=(const vtkStringToken& a, const char* b);
265VTK_ABI_NAMESPACE_END
266
267namespace std
268{
271template <>
272struct VTKCOMMONCORE_EXPORT hash<vtkStringToken>
273{
274 std::size_t operator()(const vtkStringToken& t) const { return t.GetId(); }
275};
276} // namespace std
277
278#undef VTK_STRING_TOKEN_SPACE_BEFORE_SUFFIX
279#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 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.
std::unordered_set< vtkStringToken > Children(bool recursive=true)
Return all the children of this token.
static std::unordered_set< vtkStringToken > AllGroups()
Return all the tokens that have 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.
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
std::size_t operator()(const vtkStringToken &t) const
void VTKCOMMONCORE_EXPORT 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)
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)
void VTKCOMMONCORE_EXPORT from_json(const nlohmann::json &jj, vtkStringToken &tt)
Convert a JSON value into a string token.
#define VTK_WRAPEXCLUDE