7#ifndef PXR_USD_USD_PRIM_FLAGS_H
8#define PXR_USD_USD_PRIM_FLAGS_H
59#include "pxr/usd/usd/api.h"
66PXR_NAMESPACE_OPEN_SCOPE
77 Usd_PrimComponentFlag,
80 Usd_PrimHasClassSpecifierFlag,
81 Usd_PrimHasDefiningSpecifierFlag,
85 Usd_PrimHasPayloadFlag,
88 Usd_PrimPrototypeFlag,
89 Usd_PrimInstanceProxyFlag,
90 Usd_PrimPseudoRootFlag,
95typedef std::bitset<Usd_PrimNumFlags> Usd_PrimFlagBits;
101 Usd_Term(Usd_PrimFlags flag) : flag(flag), negated(false) {}
102 Usd_Term(Usd_PrimFlags flag,
bool negated) : flag(flag), negated(negated) {}
103 Usd_Term operator!()
const {
return Usd_Term(flag, !negated); }
104 bool operator==(Usd_Term other)
const {
105 return flag == other.flag && negated == other.negated;
107 bool operator!=(Usd_Term other)
const {
108 return !(*
this == other);
115operator!(Usd_PrimFlags flag) {
116 return Usd_Term(flag,
true);
120class Usd_PrimFlagsPredicate
124 typedef bool result_type;
127 Usd_PrimFlagsPredicate() : _negate(false) {}
129 Usd_PrimFlagsPredicate(Usd_PrimFlags flag)
132 _values[flag] =
true;
136 Usd_PrimFlagsPredicate(Usd_Term term)
138 _mask[term.flag] = 1;
139 _values[term.flag] = !term.negated;
144 static Usd_PrimFlagsPredicate Tautology() {
145 return Usd_PrimFlagsPredicate();
150 static Usd_PrimFlagsPredicate Contradiction() {
151 return Usd_PrimFlagsPredicate()._Negate();
157 Usd_PrimFlagsPredicate &TraverseInstanceProxies(
bool traverse) {
159 _mask[Usd_PrimInstanceProxyFlag] = 0;
160 _values[Usd_PrimInstanceProxyFlag] = 1;
163 _mask[Usd_PrimInstanceProxyFlag] = 1;
164 _values[Usd_PrimInstanceProxyFlag] = 0;
171 bool IncludeInstanceProxiesInTraversal()
const {
172 return !_mask[Usd_PrimInstanceProxyFlag] &&
173 _values[Usd_PrimInstanceProxyFlag];
178 bool operator()(
const class UsdPrim &prim)
const;
183 bool _IsTautology()
const {
return *
this == Tautology(); }
186 void _MakeTautology() { *
this = Tautology(); }
189 bool _IsContradiction()
const {
return *
this == Contradiction(); }
192 void _MakeContradiction() { *
this = Contradiction(); }
195 Usd_PrimFlagsPredicate &_Negate() {
201 Usd_PrimFlagsPredicate _GetNegated()
const {
202 return Usd_PrimFlagsPredicate(*this)._Negate();
206 Usd_PrimFlagBits _mask;
209 Usd_PrimFlagBits _values;
214 template <
class PrimPtr>
215 bool _Eval(
const PrimPtr &prim,
bool isInstanceProxy)
const {
218 const Usd_PrimFlagBits primFlags = Usd_PrimFlagBits(prim->_GetFlags())
219 .set(Usd_PrimInstanceProxyFlag, isInstanceProxy);
223 return ((primFlags & _mask) == (_values & _mask)) ^ _negate;
228 template <
class PrimPtr>
230 Usd_EvalPredicate(
const Usd_PrimFlagsPredicate &pred,
const PrimPtr &prim,
231 bool isInstanceProxy) {
232 return pred._Eval(prim, isInstanceProxy);
238 template <
class PrimPtr>
240 Usd_EvalPredicate(
const Usd_PrimFlagsPredicate &pred,
const PrimPtr &prim,
241 const SdfPath &proxyPrimPath) {
242 return pred._Eval(prim, Usd_IsInstanceProxy(prim, proxyPrimPath));
247 operator==(
const Usd_PrimFlagsPredicate &lhs,
248 const Usd_PrimFlagsPredicate &rhs) {
249 return lhs._mask == rhs._mask &&
250 lhs._values == rhs._values &&
251 lhs._negate == rhs._negate;
255 operator!=(
const Usd_PrimFlagsPredicate &lhs,
256 const Usd_PrimFlagsPredicate &rhs) {
257 return !(lhs == rhs);
261 friend size_t hash_value(
const Usd_PrimFlagsPredicate &p) {
263 p._mask.to_ulong(), p._values.to_ulong(), p._negate
283class Usd_PrimFlagsConjunction :
public Usd_PrimFlagsPredicate {
286 Usd_PrimFlagsConjunction() {};
289 explicit Usd_PrimFlagsConjunction(Usd_Term term) {
294 Usd_PrimFlagsConjunction &operator&=(Usd_Term term) {
296 if (ARCH_UNLIKELY(_IsContradiction()))
300 if (!_mask[term.flag]) {
301 _mask[term.flag] = 1;
302 _values[term.flag] = !term.negated;
303 }
else if (_values[term.flag] != !term.negated) {
307 _MakeContradiction();
330 class Usd_PrimFlagsDisjunction operator!() const;
335 friend class Usd_PrimFlagsDisjunction;
336 Usd_PrimFlagsConjunction(
const Usd_PrimFlagsPredicate &base) :
337 Usd_PrimFlagsPredicate(base) {}
340 friend Usd_PrimFlagsConjunction
341 operator&&(Usd_Term lhs, Usd_Term rhs);
344 friend Usd_PrimFlagsConjunction
345 operator&&(
const Usd_PrimFlagsConjunction &conjunction, Usd_Term rhs);
348 friend Usd_PrimFlagsConjunction
349 operator&&(Usd_Term lhs,
const Usd_PrimFlagsConjunction &conjunction);
352inline Usd_PrimFlagsConjunction
353operator&&(Usd_Term lhs, Usd_Term rhs) {
356 Usd_PrimFlagsConjunction tmp;
357 return (tmp && lhs) && rhs;
360inline Usd_PrimFlagsConjunction
361operator&&(
const Usd_PrimFlagsConjunction &conjunction, Usd_Term rhs) {
362 return Usd_PrimFlagsConjunction(conjunction) &= rhs;
365inline Usd_PrimFlagsConjunction
366operator&&(Usd_Term lhs,
const Usd_PrimFlagsConjunction &conjunction) {
367 return Usd_PrimFlagsConjunction(conjunction) &= lhs;
370inline Usd_PrimFlagsConjunction
371operator&&(Usd_PrimFlags lhs, Usd_PrimFlags rhs) {
372 return Usd_Term(lhs) && Usd_Term(rhs);
386class Usd_PrimFlagsDisjunction :
public Usd_PrimFlagsPredicate {
389 Usd_PrimFlagsDisjunction() { _Negate(); };
392 explicit Usd_PrimFlagsDisjunction(Usd_Term term) {
398 Usd_PrimFlagsDisjunction &operator|=(Usd_Term term) {
400 if (ARCH_UNLIKELY(_IsTautology()))
404 if (!_mask[term.flag]) {
405 _mask[term.flag] = 1;
406 _values[term.flag] = term.negated;
407 }
else if (_values[term.flag] != term.negated) {
434 class Usd_PrimFlagsConjunction operator!() const;
439 friend class Usd_PrimFlagsConjunction;
440 Usd_PrimFlagsDisjunction(
const Usd_PrimFlagsPredicate &base) :
441 Usd_PrimFlagsPredicate(base) {}
444 friend Usd_PrimFlagsDisjunction operator||(Usd_Term lhs, Usd_Term rhs);
447 friend Usd_PrimFlagsDisjunction
448 operator||(
const Usd_PrimFlagsDisjunction &disjunction, Usd_Term rhs);
451 friend Usd_PrimFlagsDisjunction
452 operator||(Usd_Term lhs,
const Usd_PrimFlagsDisjunction &disjunction);
455inline Usd_PrimFlagsDisjunction
456operator||(Usd_Term lhs, Usd_Term rhs) {
457 return (Usd_PrimFlagsDisjunction() || lhs) || rhs;
460inline Usd_PrimFlagsDisjunction
461operator||(
const Usd_PrimFlagsDisjunction &disjunction, Usd_Term rhs) {
462 return Usd_PrimFlagsDisjunction(disjunction) |= rhs;
465inline Usd_PrimFlagsDisjunction
466operator||(Usd_Term lhs,
const Usd_PrimFlagsDisjunction &disjunction) {
467 return Usd_PrimFlagsDisjunction(disjunction) |= lhs;
470inline Usd_PrimFlagsDisjunction
471operator||(Usd_PrimFlags lhs, Usd_PrimFlags rhs) {
472 return Usd_Term(lhs) || Usd_Term(rhs);
525 = Usd_PrimHasClassSpecifierFlag;
527 = Usd_PrimHasDefiningSpecifierFlag;
564inline Usd_PrimFlagsPredicate
567 return predicate.TraverseInstanceProxies(
true);
574inline Usd_PrimFlagsPredicate
580PXR_NAMESPACE_CLOSE_SCOPE
A path value used to locate objects in layers or scenegraphs.
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
UsdPrim is the sole persistent scenegraph object on a UsdStage, and is the embodiment of a "Prim" as ...
std::size_t hash_value(const half h)
Overload hash_value for half.
unspecified UsdPrimIsGroup
Tests UsdPrim::IsGroup()
unspecified UsdPrimIsActive
Tests UsdPrim::IsActive()
unspecified UsdPrimIsDefined
Tests UsdPrim::IsDefined()
unspecified UsdPrimIsInstance
Tests UsdPrim::IsInstance()
unspecified UsdPrimIsLoaded
Tests UsdPrim::IsLoaded()
unspecified UsdPrimDefaultPredicate
The default predicate used for prim traversals in methods like UsdPrim::GetChildren,...
unspecified UsdPrimIsAbstract
Tests UsdPrim::IsAbstract()
unspecified UsdPrimHasClassSpecifier
Tests UsdPrim::HasClassSpecifier()
unspecified UsdPrimIsModel
Tests UsdPrim::IsModel()
unspecified UsdPrimHasDefiningSpecifier
Tests UsdPrim::HasDefiningSpecifier()
Usd_PrimFlagsPredicate UsdTraverseInstanceProxies()
This is an overloaded member function, provided for convenience. It differs from the above function o...
unspecified UsdPrimAllPrimsPredicate
Predicate that includes all prims.