7#ifndef PXR_USD_SDF_PATH_H
8#define PXR_USD_SDF_PATH_H
11#include "pxr/usd/sdf/api.h"
12#include "pxr/usd/sdf/pool.h"
13#include "pxr/usd/sdf/tokens.h"
14#include "pxr/base/arch/defines.h"
15#include "pxr/base/tf/delegatedCountPtr.h"
29PXR_NAMESPACE_OPEN_SCOPE
41void TfDelegatedCountIncrement(Sdf_PathNode
const *)
noexcept;
42void TfDelegatedCountDecrement(Sdf_PathNode
const *)
noexcept;
45struct Sdf_PathPrimTag;
46struct Sdf_PathPropTag;
51static constexpr size_t Sdf_SizeofPrimPathNode = 16;
52static constexpr size_t Sdf_SizeofPropPathNode = 16;
54static constexpr size_t Sdf_SizeofPrimPathNode = 24;
55static constexpr size_t Sdf_SizeofPropPathNode = 24;
58using Sdf_PathPrimPartPool = Sdf_Pool<
59 Sdf_PathPrimTag, Sdf_SizeofPrimPathNode, 8>;
61using Sdf_PathPropPartPool = Sdf_Pool<
62 Sdf_PathPropTag, Sdf_SizeofPropPathNode, 8>;
64using Sdf_PathPrimHandle = Sdf_PathPrimPartPool::Handle;
65using Sdf_PathPropHandle = Sdf_PathPropPartPool::Handle;
68template <
class Handle,
bool Counted,
class PathNode=Sdf_PathNode const>
69struct Sdf_PathNodeHandleImpl {
71 typedef Sdf_PathNodeHandleImpl this_type;
74 static constexpr bool IsCounted = Counted;
76 constexpr Sdf_PathNodeHandleImpl() noexcept {};
79 Sdf_PathNodeHandleImpl(Sdf_PathNode
const *p,
bool add_ref =
true)
80 : _poolHandle(Handle::GetHandle(reinterpret_cast<char const *>(p))) {
87 Sdf_PathNodeHandleImpl(Handle h,
bool add_ref =
true)
94 Sdf_PathNodeHandleImpl(Sdf_PathNodeHandleImpl
const &rhs) noexcept
95 : _poolHandle(rhs._poolHandle) {
101 ~Sdf_PathNodeHandleImpl() {
107 Sdf_PathNodeHandleImpl &
108 operator=(Sdf_PathNodeHandleImpl
const &rhs) {
109 if (Counted && *
this == rhs) {
112 this_type(rhs).swap(*
this);
116 Sdf_PathNodeHandleImpl(Sdf_PathNodeHandleImpl &&rhs) noexcept
117 : _poolHandle(rhs._poolHandle) {
118 rhs._poolHandle =
nullptr;
121 Sdf_PathNodeHandleImpl &
122 operator=(Sdf_PathNodeHandleImpl &&rhs)
noexcept {
123 this_type(std::move(rhs)).swap(*
this);
127 Sdf_PathNodeHandleImpl &
128 operator=(Sdf_PathNode
const *rhs)
noexcept {
129 this_type(rhs).swap(*
this);
133 void reset() noexcept {
134 _poolHandle = Handle {
nullptr };
137 inline Sdf_PathNode
const *
138 get() const noexcept {
139 return reinterpret_cast<Sdf_PathNode *
>(_poolHandle.GetPtr());
152 explicit operator bool() const noexcept {
153 return static_cast<bool>(_poolHandle);
156 void swap(Sdf_PathNodeHandleImpl &rhs)
noexcept {
157 _poolHandle.swap(rhs._poolHandle);
160 inline bool operator==(Sdf_PathNodeHandleImpl
const &rhs)
const noexcept {
161 return _poolHandle == rhs._poolHandle;
163 inline bool operator!=(Sdf_PathNodeHandleImpl
const &rhs)
const noexcept {
164 return _poolHandle != rhs._poolHandle;
166 inline bool operator<(Sdf_PathNodeHandleImpl
const &rhs)
const noexcept {
167 return _poolHandle < rhs._poolHandle;
171 inline void _AddRef(Sdf_PathNode
const *p)
const {
173 TfDelegatedCountIncrement(p);
177 inline void _AddRef()
const {
181 inline void _DecRef()
const {
183 TfDelegatedCountDecrement(get());
187 Handle _poolHandle {
nullptr };
190using Sdf_PathPrimNodeHandle =
191 Sdf_PathNodeHandleImpl<Sdf_PathPrimHandle,
true>;
193using Sdf_PathPropNodeHandle =
194 Sdf_PathNodeHandleImpl<Sdf_PathPropHandle,
false>;
198typedef std::set<class SdfPath> SdfPathSet;
200typedef std::vector<class SdfPath> SdfPathVector;
203VT_TYPE_IS_CHEAP_TO_COPY(
class SdfPath);
378 return static_cast<bool>(_propPart);
496 SDF_API
void GetPrefixes(SdfPathVector *prefixes,
size_t numPrefixes)
const;
702 const std::string &variant)
const;
766 bool fixTargetPaths=
true)
const;
788 std::pair<SdfPath, SdfPath>
790 bool stopAtRootPrim =
false)
const;
857 const std::string &rhs);
887 static std::pair<std::string, bool>
889 const std::string &matchNamespace);
897 std::string *errMsg = 0);
906 return _AsInt() == rhs._AsInt();
911 return !(*
this == rhs);
919 if (_AsInt() == rhs._AsInt()) {
922 if (!_primPart || !rhs._primPart) {
923 return !_primPart && rhs._primPart;
926 return _LessThanInternal(*
this, rhs);
938 return !(rhs < *
this);
944 return !(*
this < rhs);
947 template <
class HashState>
948 friend void TfHashAppend(HashState &h,
SdfPath const &path) {
951 uint32_t primPart, propPart;
952 memcpy(&primPart, &path._primPart,
sizeof(primPart));
953 memcpy(&propPart, &path._propPart,
sizeof(propPart));
960 inline size_t operator()(
const SdfPath& path)
const {
965 inline size_t GetHash()
const {
966 return Hash()(*this);
971 struct FastLessThan {
972 inline bool operator()(
const SdfPath& a,
const SdfPath& b)
const {
973 return a._AsInt() < b._AsInt();
988 SDF_API
static SdfPathVector
1009 explicit SdfPath(Sdf_PathPrimNodeHandle &&primNode)
1010 : _primPart(
std::move(primNode)) {}
1012 SdfPath(Sdf_PathPrimNodeHandle &&primPart,
1013 Sdf_PathPropNodeHandle &&propPart)
1014 : _primPart(
std::move(primPart))
1015 , _propPart(
std::move(propPart)) {}
1018 SdfPath(Sdf_PathPrimNodeHandle
const &primPart,
1019 Sdf_PathPropNodeHandle
const &propPart)
1020 : _primPart(primPart)
1021 , _propPart(propPart) {}
1024 SdfPath(Sdf_PathNode
const *primPart,
1025 Sdf_PathNode
const *propPart)
1026 : _primPart(primPart)
1027 , _propPart(propPart) {}
1029 friend class Sdf_PathNode;
1030 friend class Sdfext_PathAccess;
1032 friend class Sdf_PathInitAccess;
1035 SdfPath const &newPrefix)
const;
1038 SdfPath const &newPrefix)
const;
1042 bool fixTargetPaths)
const;
1048 inline uint64_t _AsInt()
const {
1049 static_assert(
sizeof(*this) ==
sizeof(uint64_t),
"");
1051 std::memcpy(&ret,
this,
sizeof(*
this));
1056 lhs._primPart.swap(rhs._primPart);
1057 lhs._propPart.swap(rhs._propPart);
1060 SDF_API
friend char const *
1061 Sdf_PathGetDebuggerPathText(
SdfPath const &);
1063 Sdf_PathPrimNodeHandle _primPart;
1064 Sdf_PathPropNodeHandle _propPart;
1092 const SdfPath& GetPath()
const {
return _path; }
1095 using iterator_category = std::forward_iterator_tag;
1097 using difference_type = std::ptrdiff_t;
1098 using reference =
const SdfPath&;
1099 using pointer =
const SdfPath*;
1101 iterator(
const SdfPath& path) : _path(path) {}
1103 iterator() =
default;
1106 iterator& operator++();
1108 const SdfPath& operator*()
const {
return _path; }
1110 const SdfPath* operator->()
const {
return &_path; }
1112 bool operator==(
const iterator& o)
const {
return _path == o._path; }
1114 bool operator!=(
const iterator& o)
const {
return _path != o._path; }
1119 SDF_API
friend difference_type
1120 distance(
const iterator& first,
const iterator& last);
1126 iterator begin()
const {
return iterator(_path); }
1128 iterator end()
const {
return iterator(); }
1136inline size_t hash_value(
SdfPath const &path)
1138 return path.GetHash();
1146struct Sdf_PathIdentity {
1158template <
class ForwardIterator,
class GetPathFn = Sdf_PathIdentity>
1159std::pair<ForwardIterator, ForwardIterator>
1160SdfPathFindPrefixedRange(ForwardIterator begin, ForwardIterator end,
1162 GetPathFn
const &getPath = GetPathFn()) {
1164 typename std::iterator_traits<ForwardIterator>::reference;
1167 Compare(GetPathFn
const &getPath) : _getPath(getPath) {}
1168 GetPathFn
const &_getPath;
1169 bool operator()(IterRef a,
SdfPath const &b)
const {
1170 return _getPath(a) < b;
1174 std::pair<ForwardIterator, ForwardIterator> result;
1177 result.first = std::lower_bound(begin, end, prefix, Compare(getPath));
1181 result.second = TfFindBoundary(result.first, end,
1182 [&prefix, &getPath](IterRef iterRef) {
1183 return getPath(iterRef).HasPrefix(prefix);
1189template <
class RandomAccessIterator,
class GetPathFn>
1191Sdf_PathFindLongestPrefixImpl(RandomAccessIterator begin,
1192 RandomAccessIterator end,
1195 GetPathFn
const &getPath)
1198 typename std::iterator_traits<RandomAccessIterator>::reference;
1201 Compare(GetPathFn
const &getPath) : _getPath(getPath) {}
1202 GetPathFn
const &_getPath;
1203 bool operator()(IterRef a,
SdfPath const &b)
const {
1204 return _getPath(a) < b;
1217 Compare comp(getPath);
1220 RandomAccessIterator result = std::lower_bound(begin, end, path, comp);
1224 if (!strictPrefix && result != end && getPath(*result) == path) {
1230 if (result == begin) {
1235 if (path.
HasPrefix(getPath(*--result))) {
1245 result = std::lower_bound(begin, end, newPath, comp);
1247 if (result != end && getPath(*result) == newPath) {
1250 if (result == begin) {
1253 if (newPath.
HasPrefix(getPath(*--result))) {
1267template <
class RandomAccessIterator,
class GetPathFn = Sdf_PathIdentity,
1268 class =
typename std::enable_if<
1270 std::random_access_iterator_tag,
1271 typename std::iterator_traits<
1272 RandomAccessIterator>::iterator_category
1277SdfPathFindLongestPrefix(RandomAccessIterator begin,
1278 RandomAccessIterator end,
1280 GetPathFn
const &getPath = GetPathFn())
1282 return Sdf_PathFindLongestPrefixImpl(
1283 begin, end, path,
false, getPath);
1293template <
class RandomAccessIterator,
class GetPathFn = Sdf_PathIdentity,
1294 class =
typename std::enable_if<
1296 std::random_access_iterator_tag,
1297 typename std::iterator_traits<
1298 RandomAccessIterator>::iterator_category
1303SdfPathFindLongestStrictPrefix(RandomAccessIterator begin,
1304 RandomAccessIterator end,
1306 GetPathFn
const &getPath = GetPathFn())
1308 return Sdf_PathFindLongestPrefixImpl(
1309 begin, end, path,
true, getPath);
1312template <
class Iter,
class MapParam,
class GetPathFn = Sdf_PathIdentity>
1314Sdf_PathFindLongestPrefixImpl(
1315 MapParam map,
SdfPath const &path,
bool strictPrefix,
1316 GetPathFn
const &getPath = GetPathFn())
1323 const Iter mapEnd = map.end();
1330 Iter result = map.lower_bound(path);
1334 if (!strictPrefix && result != mapEnd && getPath(*result) == path)
1339 if (result == map.begin())
1350 return Sdf_PathFindLongestPrefixImpl<Iter, MapParam>(
1359typename std::set<SdfPath>::const_iterator
1360SdfPathFindLongestPrefix(std::set<SdfPath>
const &set,
SdfPath const &path);
1366typename std::map<SdfPath, T>::const_iterator
1367SdfPathFindLongestPrefix(std::map<SdfPath, T>
const &map,
SdfPath const &path)
1369 return Sdf_PathFindLongestPrefixImpl<
1370 typename std::map<SdfPath, T>::const_iterator,
1371 std::map<SdfPath, T>
const &>(map, path,
false,
1375typename std::map<SdfPath, T>::iterator
1376SdfPathFindLongestPrefix(std::map<SdfPath, T> &map,
SdfPath const &path)
1378 return Sdf_PathFindLongestPrefixImpl<
1379 typename std::map<SdfPath, T>::iterator,
1380 std::map<SdfPath, T> &>(map, path,
false,
1388typename std::set<SdfPath>::const_iterator
1389SdfPathFindLongestStrictPrefix(std::set<SdfPath>
const &set,
1396typename std::map<SdfPath, T>::const_iterator
1397SdfPathFindLongestStrictPrefix(
1398 std::map<SdfPath, T>
const &map,
SdfPath const &path)
1400 return Sdf_PathFindLongestPrefixImpl<
1401 typename std::map<SdfPath, T>::const_iterator,
1402 std::map<SdfPath, T>
const &>(map, path,
true,
1406typename std::map<SdfPath, T>::iterator
1407SdfPathFindLongestStrictPrefix(
1408 std::map<SdfPath, T> &map,
SdfPath const &path)
1410 return Sdf_PathFindLongestPrefixImpl<
1411 typename std::map<SdfPath, T>::iterator,
1412 std::map<SdfPath, T> &>(map, path,
true,
1423Sdf_PathGetDebuggerPathText(
SdfPath const &);
1425PXR_NAMESPACE_CLOSE_SCOPE
1430#include "pxr/usd/sdf/pathNode.h"
1432PXR_NAMESPACE_OPEN_SCOPE
1434static_assert(Sdf_SizeofPrimPathNode ==
sizeof(Sdf_PrimPathNode),
"");
1435static_assert(Sdf_SizeofPropPathNode ==
sizeof(Sdf_PrimPropertyPathNode),
"");
1437PXR_NAMESPACE_CLOSE_SCOPE
Range representing a path and ancestors, and providing methods for iterating over them.
A path value used to locate objects in layers or scenegraphs.
SDF_API SdfPath MakeAbsolutePath(const SdfPath &anchor) const
Returns the absolute form of this path using anchor as the relative basis.
SDF_API SdfPath GetParentPath() const
Return the path that identifies this path's namespace parent.
SDF_API const std::string & GetString() const
Return the string representation of this path as a std::string.
SDF_API bool IsPrimVariantSelectionPath() const
Returns whether the path identifies a variant selection for a prim.
static SDF_API std::string JoinIdentifier(const TfTokenVector &names)
Join names into a single identifier using the namespace delimiter.
static SDF_API bool IsValidIdentifier(const std::string &name)
Returns whether name is a legal identifier for any path component.
SDF_API SdfPath ReplaceTargetPath(const SdfPath &newTargetPath) const
Replaces the relational attribute's target path.
SDF_API void GetAllTargetPathsRecursively(SdfPathVector *result) const
Returns all the relationship target or connection target paths contained in this path,...
SDF_API SdfPath GetPrimOrPrimVariantSelectionPath() const
Creates a path by stripping all relational attributes, targets, and properties, leaving the nearest p...
SDF_API std::pair< SdfPath, SdfPath > RemoveCommonSuffix(const SdfPath &otherPath, bool stopAtRootPrim=false) const
Find and remove the longest common suffix from two paths.
SDF_API SdfPath AppendElementString(const std::string &element) const
Creates a path by extracting and appending an element from the given ascii element encoding.
SDF_API bool IsMapperArgPath() const
Returns whether the path identifies a connection mapper arg.
SDF_API bool IsRelationalAttributePath() const
Returns whether the path identifies a relational attribute.
static SDF_API TfToken StripNamespace(const TfToken &name)
Returns name stripped of any namespaces.
SDF_API bool IsAbsoluteRootOrPrimPath() const
Returns whether the path identifies a prim or the absolute root.
static SDF_API const SdfPath & AbsoluteRootPath()
The absolute path representing the top of the namespace hierarchy.
SDF_API const char * GetText() const
Returns the string representation of this path as a c string.
static SDF_API SdfPathVector GetConciseRelativePaths(const SdfPathVector &paths)
Given some vector of paths, get a vector of concise unambiguous relative paths.
SDF_API std::pair< std::string, std::string > GetVariantSelection() const
Returns the variant selection for this path, if this is a variant selection path.
bool operator<=(const SdfPath &rhs) const
Less than or equal operator.
SDF_API SdfPath AppendExpression() const
Creates a path by appending an expression element.
SDF_API SdfPath AppendRelationalAttribute(TfToken const &attrName) const
Creates a path by appending an element for attrName to this path.
SDF_API std::string GetElementString() const
Returns an ascii representation of the "terminal" element of this path, which can be used to reconstr...
bool IsEmpty() const noexcept
Returns true if this is the empty path (SdfPath::EmptyPath()).
SDF_API bool IsAbsolutePath() const
Returns whether the path is absolute.
SDF_API SdfPath GetAbsoluteRootOrPrimPath() const
Creates a path by stripping all properties and relational attributes from this path,...
SDF_API SdfPath AppendPath(const SdfPath &newSuffix) const
Creates a path by appending a given relative path to this path.
SDF_API SdfPath MakeRelativePath(const SdfPath &anchor) const
Returns the relative form of this path using anchor as the relative basis.
static SDF_API const SdfPath & ReflexiveRelativePath()
The relative path representing "self".
bool operator>(const SdfPath &rhs) const
Greater than operator.
static SDF_API std::string JoinIdentifier(const std::string &lhs, const std::string &rhs)
Join lhs and rhs into a single identifier using the namespace delimiter.
static SDF_API std::vector< std::string > TokenizeIdentifier(const std::string &name)
Tokenizes name by the namespace delimiter.
SDF_API bool IsPropertyPath() const
Returns whether the path identifies a property.
SDF_API SdfPath AppendMapper(const SdfPath &targetPath) const
Creates a path by appending a mapper element for targetPath.
SDF_API SdfPath AppendElementToken(const TfToken &elementTok) const
Like AppendElementString() but take the element as a TfToken.
SDF_API bool HasPrefix(const SdfPath &prefix) const
Return true if both this path and prefix are not the empty path and this path has prefix as a prefix.
static SDF_API std::string JoinIdentifier(const std::vector< std::string > &names)
Join names into a single identifier using the namespace delimiter.
SDF_API bool IsTargetPath() const
Returns whether the path identifies a relationship or connection target.
SDF_API size_t GetPathElementCount() const
Returns the number of path elements in this path.
SDF_API TfToken GetElementToken() const
Like GetElementString() but return the value as a TfToken.
static SDF_API const SdfPath & EmptyPath()
The empty path value, equivalent to SdfPath().
SDF_API const std::string & GetName() const
Returns the name of the prim, property or relational attribute identified by the path.
SDF_API TfToken GetAsToken() const
Return the string representation of this path as a TfToken.
SDF_API const SdfPath & GetTargetPath() const
Returns the relational attribute or mapper target path for this path.
SDF_API SdfPathVector GetPrefixes() const
Returns the prefix paths of this path.
static SDF_API std::string StripNamespace(const std::string &name)
Returns name stripped of any namespaces.
SDF_API void GetPrefixes(SdfPathVector *prefixes, size_t numPrefixes) const
Fill prefixes with up to numPrefixes prefixes of this path.
static SDF_API TfTokenVector TokenizeIdentifierAsTokens(const std::string &name)
Tokenizes name by the namespace delimiter.
SDF_API bool IsRootPrimPath() const
Returns whether the path identifies a root prim.
static SDF_API bool IsValidNamespacedIdentifier(const std::string &name)
Returns whether name is a legal namespaced identifier.
SDF_API const TfToken & GetNameToken() const
Returns the name of the prim, property or relational attribute identified by the path,...
SDF_API bool IsPrimPath() const
Returns whether the path identifies a prim.
static SDF_API std::pair< std::string, bool > StripPrefixNamespace(const std::string &name, const std::string &matchNamespace)
Returns (name, true) where name is stripped of the prefix specified by matchNamespace if name indeed ...
SDF_API SdfPath AppendVariantSelection(const std::string &variantSet, const std::string &variant) const
Creates a path by appending an element for variantSet and variant to this path.
SDF_API SdfPath AppendProperty(TfToken const &propName) const
Creates a path by appending an element for propName to this path.
SDF_API bool IsExpressionPath() const
Returns whether the path identifies a connection expression.
SDF_API bool IsNamespacedPropertyPath() const
Returns whether the path identifies a namespaced property.
SDF_API SdfPath AppendMapperArg(TfToken const &argName) const
Creates a path by appending an element for argName.
SDF_API TfToken const & GetToken() const
Return the string representation of this path as a TfToken lvalue.
bool operator<(const SdfPath &rhs) const
Comparison operator.
bool operator>=(const SdfPath &rhs) const
Greater than or equal operator.
SDF_API SdfPath AppendChild(TfToken const &childName) const
Creates a path by appending an element for childName to this path.
bool ContainsPropertyElements() const
Return true if this path contains any property elements, false otherwise.
SDF_API bool IsMapperPath() const
Returns whether the path identifies a connection mapper.
static SDF_API void RemoveDescendentPaths(SdfPathVector *paths)
Remove all elements of paths that are prefixed by other elements in paths.
SDF_API SdfPath GetCommonPrefix(const SdfPath &path) const
Returns a path with maximal length that is a prefix path of both this path and path.
static SDF_API std::string JoinIdentifier(const TfToken &lhs, const TfToken &rhs)
Join lhs and rhs into a single identifier using the namespace delimiter.
static SDF_API bool IsValidPathString(const std::string &pathString, std::string *errMsg=0)
Return true if pathString is a valid path string, meaning that passing the string to the SdfPath cons...
SDF_API SdfPath ReplacePrefix(const SdfPath &oldPrefix, const SdfPath &newPrefix, bool fixTargetPaths=true) const
Returns a path with all occurrences of the prefix path oldPrefix replaced with the prefix path newPre...
SDF_API TfSpan< SdfPath > GetPrefixes(TfSpan< SdfPath > prefixes) const
Fill prefixes with up to prefixes.size() prefixes of this path.
SDF_API bool IsAbsoluteRootPath() const
Return true if this path is the AbsoluteRootPath().
bool operator==(const SdfPath &rhs) const
Equality operator.
SDF_API SdfPathAncestorsRange GetAncestorsRange() const
Return a range for iterating over the ancestors of this path.
SDF_API bool ContainsPrimVariantSelection() const
Returns whether the path or any of its parent paths identifies a variant selection for a prim.
SDF_API bool IsPrimPropertyPath() const
Returns whether the path identifies a prim's property.
SDF_API SdfPath StripAllVariantSelections() const
Create a path by stripping all variant selections from all components of this path,...
SDF_API bool ContainsTargetPath() const
Return true if this path is or has a prefix that's a target path or a mapper path.
SDF_API SdfPath ReplaceName(TfToken const &newName) const
Return a copy of this path with its final component changed to newName.
SDF_API void GetPrefixes(SdfPathVector *prefixes) const
Fills prefixes with prefixes of this path.
SDF_API bool IsPrimOrPrimVariantSelectionPath() const
Return true if this path is a prim path or is a prim variant selection path.
SDF_API SdfPath AppendTarget(const SdfPath &targetPath) const
Creates a path by appending an element for targetPath.
SdfPath() noexcept=default
Constructs the default, empty path.
SDF_API SdfPathVector GetPrefixes(size_t numPrefixes) const
Return up to numPrefixes prefix paths of this path.
SDF_API SdfPath GetPrimPath() const
Creates a path by stripping all relational attributes, targets, properties, and variant selections fr...
static SDF_API void RemoveAncestorPaths(SdfPathVector *paths)
Remove all elements of paths that prefix other elements in paths.
bool operator!=(const SdfPath &rhs) const
Inequality operator.
SDF_API std::string GetAsString() const
Return the string representation of this path as a std::string.
Stores a pointer to a ValueType which uses TfDelegatedCountIncrement and TfDelegatedCountDecrement to...
Function object for retrieving the N'th element of a std::pair or std::tuple.
A user-extensible hashing mechanism for use with runtime hash tables.
Represents a range of contiguous elements.
Token for efficient comparison, assignment, and hashing of known strings.
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...
std::vector< TfToken > TfTokenVector
Convenience types.