24 #ifndef PXR_USD_USD_PRIM_FLAGS_H 25 #define PXR_USD_USD_PRIM_FLAGS_H 76 #include "pxr/usd/usd/api.h" 83 PXR_NAMESPACE_OPEN_SCOPE
96 Usd_PrimHasDefiningSpecifierFlag,
100 Usd_PrimHasPayloadFlag,
103 Usd_PrimPrototypeFlag,
104 Usd_PrimInstanceProxyFlag,
105 Usd_PrimPseudoRootFlag,
110 typedef std::bitset<Usd_PrimNumFlags> Usd_PrimFlagBits;
116 Usd_Term(Usd_PrimFlags flag) : flag(flag), negated(false) {}
117 Usd_Term(Usd_PrimFlags flag,
bool negated) : flag(flag), negated(negated) {}
118 Usd_Term operator!()
const {
return Usd_Term(flag, !negated); }
120 return flag == other.flag && negated == other.negated;
122 bool operator!=(Usd_Term other)
const {
123 return !(*
this == other);
130 operator!(Usd_PrimFlags flag) {
131 return Usd_Term(flag,
true);
135 class Usd_PrimFlagsPredicate
139 typedef bool result_type;
142 Usd_PrimFlagsPredicate() : _negate(false) {}
144 Usd_PrimFlagsPredicate(Usd_PrimFlags flag)
147 _values[flag] =
true;
151 Usd_PrimFlagsPredicate(Usd_Term term)
153 _mask[term.flag] = 1;
154 _values[term.flag] = !term.negated;
159 static Usd_PrimFlagsPredicate Tautology() {
160 return Usd_PrimFlagsPredicate();
165 static Usd_PrimFlagsPredicate Contradiction() {
166 return Usd_PrimFlagsPredicate()._Negate();
172 Usd_PrimFlagsPredicate &TraverseInstanceProxies(
bool traverse) {
174 _mask[Usd_PrimInstanceProxyFlag] = 0;
175 _values[Usd_PrimInstanceProxyFlag] = 1;
178 _mask[Usd_PrimInstanceProxyFlag] = 1;
179 _values[Usd_PrimInstanceProxyFlag] = 0;
186 bool IncludeInstanceProxiesInTraversal()
const {
187 return !_mask[Usd_PrimInstanceProxyFlag] &&
188 _values[Usd_PrimInstanceProxyFlag];
193 bool operator()(
const class UsdPrim &prim)
const;
198 bool _IsTautology()
const {
return *
this == Tautology(); }
201 void _MakeTautology() { *
this = Tautology(); }
204 bool _IsContradiction()
const {
return *
this == Contradiction(); }
207 void _MakeContradiction() { *
this = Contradiction(); }
210 Usd_PrimFlagsPredicate &_Negate() {
216 Usd_PrimFlagsPredicate _GetNegated()
const {
217 return Usd_PrimFlagsPredicate(*this)._Negate();
221 Usd_PrimFlagBits _mask;
224 Usd_PrimFlagBits _values;
229 template <
class PrimPtr>
230 bool _Eval(
const PrimPtr &prim,
bool isInstanceProxy)
const {
233 const Usd_PrimFlagBits primFlags = Usd_PrimFlagBits(prim->_GetFlags())
234 .set(Usd_PrimInstanceProxyFlag, isInstanceProxy);
238 return ((primFlags & _mask) == (_values & _mask)) ^ _negate;
243 template <
class PrimPtr>
245 Usd_EvalPredicate(
const Usd_PrimFlagsPredicate &pred,
const PrimPtr &prim,
246 bool isInstanceProxy) {
247 return pred._Eval(prim, isInstanceProxy);
253 template <
class PrimPtr>
255 Usd_EvalPredicate(
const Usd_PrimFlagsPredicate &pred,
const PrimPtr &prim,
256 const SdfPath &proxyPrimPath) {
257 return pred._Eval(prim, Usd_IsInstanceProxy(prim, proxyPrimPath));
263 const Usd_PrimFlagsPredicate &rhs) {
264 return lhs._mask == rhs._mask &&
265 lhs._values == rhs._values &&
266 lhs._negate == rhs._negate;
270 operator!=(
const Usd_PrimFlagsPredicate &lhs,
271 const Usd_PrimFlagsPredicate &rhs) {
272 return !(lhs == rhs);
276 friend size_t hash_value(
const Usd_PrimFlagsPredicate &p) {
278 p._mask.to_ulong(), p._values.to_ulong(), p._negate
298 class Usd_PrimFlagsConjunction :
public Usd_PrimFlagsPredicate {
301 Usd_PrimFlagsConjunction() {};
304 explicit Usd_PrimFlagsConjunction(Usd_Term term) {
309 Usd_PrimFlagsConjunction &operator&=(Usd_Term term) {
311 if (ARCH_UNLIKELY(_IsContradiction()))
315 if (!_mask[term.flag]) {
316 _mask[term.flag] = 1;
317 _values[term.flag] = !term.negated;
318 }
else if (_values[term.flag] != !term.negated) {
322 _MakeContradiction();
345 class Usd_PrimFlagsDisjunction operator!() const;
350 friend class Usd_PrimFlagsDisjunction;
351 Usd_PrimFlagsConjunction(
const Usd_PrimFlagsPredicate &base) :
352 Usd_PrimFlagsPredicate(base) {}
355 friend Usd_PrimFlagsConjunction
356 operator&&(Usd_Term lhs, Usd_Term rhs);
359 friend Usd_PrimFlagsConjunction
360 operator&&(
const Usd_PrimFlagsConjunction &conjunction, Usd_Term rhs);
363 friend Usd_PrimFlagsConjunction
364 operator&&(Usd_Term lhs,
const Usd_PrimFlagsConjunction &conjunction);
367 inline Usd_PrimFlagsConjunction
368 operator&&(Usd_Term lhs, Usd_Term rhs) {
371 Usd_PrimFlagsConjunction tmp;
372 return (tmp && lhs) && rhs;
375 inline Usd_PrimFlagsConjunction
376 operator&&(
const Usd_PrimFlagsConjunction &conjunction, Usd_Term rhs) {
377 return Usd_PrimFlagsConjunction(conjunction) &= rhs;
380 inline Usd_PrimFlagsConjunction
381 operator&&(Usd_Term lhs,
const Usd_PrimFlagsConjunction &conjunction) {
382 return Usd_PrimFlagsConjunction(conjunction) &= lhs;
385 inline Usd_PrimFlagsConjunction
386 operator&&(Usd_PrimFlags lhs, Usd_PrimFlags rhs) {
387 return Usd_Term(lhs) && Usd_Term(rhs);
401 class Usd_PrimFlagsDisjunction :
public Usd_PrimFlagsPredicate {
404 Usd_PrimFlagsDisjunction() { _Negate(); };
407 explicit Usd_PrimFlagsDisjunction(Usd_Term term) {
413 Usd_PrimFlagsDisjunction &operator|=(Usd_Term term) {
415 if (ARCH_UNLIKELY(_IsTautology()))
419 if (!_mask[term.flag]) {
420 _mask[term.flag] = 1;
421 _values[term.flag] = term.negated;
422 }
else if (_values[term.flag] != term.negated) {
449 class Usd_PrimFlagsConjunction operator!() const;
454 friend class Usd_PrimFlagsConjunction;
455 Usd_PrimFlagsDisjunction(
const Usd_PrimFlagsPredicate &base) :
456 Usd_PrimFlagsPredicate(base) {}
459 friend Usd_PrimFlagsDisjunction operator||(Usd_Term lhs, Usd_Term rhs);
462 friend Usd_PrimFlagsDisjunction
463 operator||(
const Usd_PrimFlagsDisjunction &disjunction, Usd_Term rhs);
466 friend Usd_PrimFlagsDisjunction
467 operator||(Usd_Term lhs,
const Usd_PrimFlagsDisjunction &disjunction);
470 inline Usd_PrimFlagsDisjunction
471 operator||(Usd_Term lhs, Usd_Term rhs) {
472 return (Usd_PrimFlagsDisjunction() || lhs) || rhs;
475 inline Usd_PrimFlagsDisjunction
476 operator||(
const Usd_PrimFlagsDisjunction &disjunction, Usd_Term rhs) {
477 return Usd_PrimFlagsDisjunction(disjunction) |= rhs;
480 inline Usd_PrimFlagsDisjunction
481 operator||(Usd_Term lhs,
const Usd_PrimFlagsDisjunction &disjunction) {
482 return Usd_PrimFlagsDisjunction(disjunction) |= lhs;
485 inline Usd_PrimFlagsDisjunction
486 operator||(Usd_PrimFlags lhs, Usd_PrimFlags rhs) {
487 return Usd_Term(lhs) || Usd_Term(rhs);
538 = Usd_PrimHasDefiningSpecifierFlag;
575 inline Usd_PrimFlagsPredicate
578 return predicate.TraverseInstanceProxies(
true);
585 inline Usd_PrimFlagsPredicate
591 PXR_NAMESPACE_CLOSE_SCOPE
593 #endif // PXR_USD_USD_PRIM_FLAGS_H
unspecified UsdPrimDefaultPredicate
The default predicate used for prim traversals in methods like UsdPrim::GetChildren,...
unspecified UsdPrimIsAbstract
Tests UsdPrim::IsAbstract()
unspecified UsdPrimHasDefiningSpecifier
Tests UsdPrim::HasDefiningSpecifier()
unspecified UsdPrimIsModel
Tests UsdPrim::IsModel()
unspecified UsdPrimIsActive
Tests UsdPrim::IsActive()
unspecified UsdPrimIsLoaded
Tests UsdPrim::IsLoaded()
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
unspecified UsdPrimIsDefined
Tests UsdPrim::IsDefined()
UsdPrim is the sole persistent scenegraph object on a UsdStage, and is the embodiment of a "Prim" as ...
Usd_PrimFlagsPredicate UsdTraverseInstanceProxies(Usd_PrimFlagsPredicate predicate)
This function is used to allow the prim traversal functions listed under Prim predicate flags to trav...
A path value used to locate objects in layers or scenegraphs.
size_t hash_value(const half h)
Overload hash_value for half.
unspecified UsdPrimAllPrimsPredicate
Predicate that includes all prims.
unspecified UsdPrimIsInstance
Tests UsdPrim::IsInstance()
VT_API bool operator==(VtDictionary const &, VtDictionary const &)
Equality comparison.
unspecified UsdPrimIsGroup
Tests UsdPrim::IsGroup()