24#ifndef PXR_BASE_TF_TOKEN_H
25#define PXR_BASE_TF_TOKEN_H
34#include "pxr/base/tf/api.h"
37#include "pxr/base/tf/hashset.h"
38#include "pxr/base/tf/pointerAndBits.h"
46PXR_NAMESPACE_OPEN_SCOPE
90 enum _ImmortalTag { Immortal };
131 TF_API
explicit TfToken(std::string
const& s);
137 TF_API
TfToken(std::string
const& s, _ImmortalTag);
163 inline size_t Hash()
const;
167 size_t operator()(
TfToken const& token)
const {
return token.
Hash(); }
175 typedef TfHashSet<TfToken, TfToken::HashFunctor>
HashSet;
183 typedef std::set<TfToken, TfTokenFastArbitraryLessThan>
Set;
187 _Rep
const *rep = _rep.
Get();
188 return rep ? rep->_str.size() : 0;
197 _Rep
const *rep = _rep.
Get();
198 return rep ? rep->_str.c_str() :
"";
208 _Rep
const *rep = _rep.
Get();
209 return rep ? rep->_str : _GetEmptyString();
214 std::swap(_rep, other._rep);
220 return _rep.
Get() == o._rep.
Get();
225 return !(*
this == o);
249 return !(*
this == o);
260 return !(*
this == o);
279 auto lrep = _rep.
Get(), rrep = r._rep.
Get();
280 uint64_t lcc = lrep->_compareCode, rcc = rrep->_compareCode;
281 return lcc < rcc || (lcc == rcc && lrep->_str < rrep->_str);
302 operator std::string
const& ()
const {
return GetString(); }
312 if (!_rep.
BitsAs<
bool>()) {
317 bool immortal = !(_rep->_refCount.load(std::memory_order_relaxed) & 1);
329 template <
class HashState>
332 h.Append(token._rep.
Get());
341 void _AddRef()
const {
342 if (!_rep.
BitsAs<
bool>()) {
347 if (!_rep->IncrementAndCheckCounted()) {
353 void _RemoveRef()
const {
354 if (!_rep.
BitsAs<
bool>()) {
365 explicit _Rep(std::string &&str,
367 uint64_t compareCode)
369 , _compareCode(compareCode)
370 , _str(
std::move(str))
371 , _cstr(_str.c_str()) {}
373 explicit _Rep(std::string
const &str,
375 uint64_t compareCode)
376 : _Rep(
std::string(str), setNum, compareCode) {}
378 explicit _Rep(
char const *str,
380 uint64_t compareCode)
381 : _Rep(
std::string(str), setNum, compareCode) {}
388 _Rep(_Rep
const &rhs)
389 : _refCount(rhs._refCount.load(
std::memory_order_relaxed))
390 , _setNum(rhs._setNum)
391 , _compareCode(rhs._compareCode)
393 , _cstr(rhs._str.c_str() == rhs._cstr ? _str.c_str() : rhs._cstr) {}
395 _Rep &operator=(_Rep
const &rhs) {
396 _refCount = rhs._refCount.load(std::memory_order_relaxed);
397 _setNum = rhs._setNum;
398 _compareCode = rhs._compareCode;
400 _cstr = (rhs._str.c_str() == rhs._cstr ? _str.c_str() : rhs._cstr);
404 inline bool IncrementAndCheckCounted()
const {
407 return _refCount.fetch_add(2, std::memory_order_relaxed) & 1;
410 inline void Decrement()
const {
413 _refCount.fetch_sub(2, std::memory_order_release);
416 mutable std::atomic_uint _refCount;
418 uint64_t _compareCode;
424 friend struct Tf_TokenRegistry;
426 TF_API
static std::string
const& _GetEmptyString();
440 inline bool operator()(
TfToken const &lhs,
TfToken const &rhs)
const {
441 return lhs._rep.
Get() < rhs._rep.
Get();
446TF_API std::vector<TfToken>
450TF_API std::vector<std::string>
459PXR_NAMESPACE_CLOSE_SCOPE
A user-extensible hashing mechanism for use with runtime hash tables.
This class stores a T * and a small integer in the space of a T *.
void SetBits(Integral val) noexcept
Set the stored bits. No static range checking is performed.
constexpr uintptr_t GetLiteral() const noexcept
Retrieve the raw underlying value.
constexpr T * Get() const noexcept
Retrieve the pointer.
constexpr Integral BitsAs() const noexcept
Retrieve the stored bits as the integral type Integral.
Token for efficient comparison, assignment, and hashing of known strings.
static TF_API TfToken Find(std::string const &s)
Find the token for the given string, if one exists.
friend bool operator!=(char const *o, TfToken const &t)
This is an overloaded member function, provided for convenience. It differs from the above function o...
std::set< TfToken, TfTokenFastArbitraryLessThan > Set
Predefined type for set of tokens, for when faster lookup is desired, without paying the memory or in...
TfToken(TfToken &&rhs) noexcept
Move constructor.
size_t size() const
Return the size of the string that this token represents.
TF_API TfToken(std::string const &s, _ImmortalTag)
This is an overloaded member function, provided for convenience. It differs from the above function o...
char const * data() const
Synonym for GetText().
bool operator!=(char const *o) const
Inequality operator for char strings.
bool operator<=(TfToken const &o) const
Less-than-or-equal operator that compares tokenized strings lexicographically.
TfHashSet< TfToken, TfToken::HashFunctor > HashSet
Predefined type for TfHashSet of tokens, since it's so awkward to manually specify.
bool operator>(TfToken const &o) const
Greater-than operator that compares tokenized strings lexicographically.
friend bool operator!=(std::string const &o, TfToken const &t)
This is an overloaded member function, provided for convenience. It differs from the above function o...
TF_API TfToken(char const *s, _ImmortalTag)
This is an overloaded member function, provided for convenience. It differs from the above function o...
friend bool operator==(const char *o, TfToken const &t)
This is an overloaded member function, provided for convenience. It differs from the above function o...
TfToken & operator=(TfToken const &rhs) noexcept
Copy assignment.
bool operator!=(TfToken const &o) const
Equality operator.
char const * GetText() const
Return the text that this token represents.
friend TF_API std::ostream & operator<<(std::ostream &stream, TfToken const &)
Stream insertion.
void Swap(TfToken &other)
Swap this token with another.
TF_API bool operator==(std::string const &o) const
Equality operator for char strings.
bool operator==(TfToken const &o) const
Equality operator.
friend bool operator==(std::string const &o, TfToken const &t)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool IsEmpty() const
Returns true iff this token contains the empty string "".
TF_API TfToken(std::string const &s)
Acquire a token for the given string.
std::string const & GetString() const
Return the string that this token represents.
TF_API bool operator==(const char *) const
Equality operator for char strings.
TF_API TfToken(char const *s)
Acquire a token for the given string.
bool operator>=(TfToken const &o) const
Greater-than-or-equal operator that compares tokenized strings lexicographically.
constexpr TfToken() noexcept=default
Create the empty token, containing the empty string.
bool operator<(TfToken const &r) const
Less-than operator that compares tokenized strings lexicographically.
size_t Hash() const
Return a size_t hash for this token.
bool IsImmortal() const
Returns true iff this is an immortal token.
friend void TfHashAppend(HashState &h, TfToken const &token)
TfHash support.
bool operator!=(std::string const &o) const
Inequality operator for string's.
Stripped down version of diagnostic.h that doesn't define std::string.
Functor to use for hash maps from tokens to other things.
Fast but non-lexicographical (in fact, arbitrary) less-than comparison for TfTokens.
size_t hash_value(const TfToken &x)
Overload hash_value for TfToken.
std::vector< TfToken > TfTokenVector
Convenience types.
TF_API std::vector< std::string > TfToStringVector(const std::vector< TfToken > &tv)
Convert the vector of TfToken tv into a vector of strings.
TF_API std::vector< TfToken > TfToTokenVector(const std::vector< std::string > &sv)
Convert the vector of strings sv into a vector of TfToken.