// This code contains NVIDIA Confidential Information and is disclosed to you // under a form of NVIDIA software license agreement provided separately to you. // // Notice // NVIDIA Corporation and its licensors retain all intellectual property and // proprietary rights in and to this software and related documentation and // any modifications thereto. Any use, reproduction, disclosure, or // distribution of this software and related documentation without an express // license agreement from NVIDIA Corporation is strictly prohibited. // // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. // // Information and code furnished is believed to be accurate and reliable. // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such // information or for any infringement of patents or other rights of third parties that may // result from its use. No license is granted by implication or otherwise under any patent // or patent rights of NVIDIA Corporation. Details are subject to change without notice. // This code supersedes and replaces all information previously supplied. // NVIDIA Corporation products are not authorized for use as critical // components in life support devices or systems without express written approval of // NVIDIA Corporation. // // Copyright (c) 2008-2013 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_FOUNDATION_PX_FLAGS_H #define PX_FOUNDATION_PX_FLAGS_H /** \addtogroup foundation @{ */ #include "foundation/Px.h" #ifndef PX_DOXYGEN namespace physx { #endif /** \brief Container for bitfield flag variables associated with a specific enum type. This allows for type safe manipulation for bitfields.

Example

// enum that defines each bit... struct MyEnum { enum Enum { eMAN = 1, eBEAR = 2, ePIG = 4, }; }; // implements some convenient global operators. PX_FLAGS_OPERATORS(MyEnum::Enum, PxU8); PxFlags myFlags; myFlags |= MyEnum::eMAN; myFlags |= MyEnum::eBEAR | MyEnum::ePIG; if(myFlags & MyEnum::eBEAR) { doSomething(); } */ template class PxFlags { public: PX_INLINE explicit PxFlags(const PxEmpty&) {} PX_INLINE PxFlags(void); PX_INLINE PxFlags(enumtype e); PX_INLINE PxFlags(const PxFlags &f); PX_INLINE explicit PxFlags(storagetype b); PX_INLINE bool operator==(enumtype e) const; PX_INLINE bool operator==(const PxFlags &f) const; PX_INLINE bool operator==(bool b) const; PX_INLINE bool operator!=(enumtype e) const; PX_INLINE bool operator!=(const PxFlags &f) const; PX_INLINE PxFlags &operator =(enumtype e); PX_INLINE PxFlags &operator|=(enumtype e); PX_INLINE PxFlags &operator|=(const PxFlags &f); PX_INLINE PxFlags operator| (enumtype e) const; PX_INLINE PxFlags operator| (const PxFlags &f) const; PX_INLINE PxFlags &operator&=(enumtype e); PX_INLINE PxFlags &operator&=(const PxFlags &f); PX_INLINE PxFlags operator& (enumtype e) const; PX_INLINE PxFlags operator& (const PxFlags &f) const; PX_INLINE PxFlags &operator^=(enumtype e); PX_INLINE PxFlags &operator^=(const PxFlags &f); PX_INLINE PxFlags operator^ (enumtype e) const; PX_INLINE PxFlags operator^ (const PxFlags &f) const; PX_INLINE PxFlags operator~ (void) const; PX_INLINE operator bool(void) const; PX_INLINE operator PxU8(void) const; PX_INLINE operator PxU16(void) const; PX_INLINE operator PxU32(void) const; PX_INLINE void clear(enumtype e); public: friend PX_INLINE PxFlags operator&(enumtype a, PxFlags &b) { PxFlags out; out.mBits = a & b.mBits; return out; } private: storagetype mBits; }; #define PX_FLAGS_OPERATORS(enumtype, storagetype) \ PX_INLINE PxFlags operator|(enumtype a, enumtype b) { PxFlags r(a); r |= b; return r; } \ PX_INLINE PxFlags operator&(enumtype a, enumtype b) { PxFlags r(a); r &= b; return r; } \ PX_INLINE PxFlags operator~(enumtype a) { return ~PxFlags(a); } template PX_INLINE PxFlags::PxFlags(void) { mBits = 0; } template PX_INLINE PxFlags::PxFlags(enumtype e) { mBits = static_cast(e); } template PX_INLINE PxFlags::PxFlags(const PxFlags &f) { mBits = f.mBits; } template PX_INLINE PxFlags::PxFlags(storagetype b) { mBits = b; } template PX_INLINE bool PxFlags::operator==(enumtype e) const { return mBits == static_cast(e); } template PX_INLINE bool PxFlags::operator==(const PxFlags& f) const { return mBits == f.mBits; } template PX_INLINE bool PxFlags::operator==(bool b) const { return ((bool)*this) == b; } template PX_INLINE bool PxFlags::operator!=(enumtype e) const { return mBits != static_cast(e); } template PX_INLINE bool PxFlags::operator!=(const PxFlags &f) const { return mBits != f.mBits; } template PX_INLINE PxFlags &PxFlags::operator =(enumtype e) { mBits = static_cast(e); return *this; } template PX_INLINE PxFlags &PxFlags::operator|=(enumtype e) { mBits |= static_cast(e); return *this; } template PX_INLINE PxFlags &PxFlags::operator|=(const PxFlags &f) { mBits |= f.mBits; return *this; } template PX_INLINE PxFlags PxFlags::operator| (enumtype e) const { PxFlags out(*this); out |= e; return out; } template PX_INLINE PxFlags PxFlags::operator| (const PxFlags &f) const { PxFlags out(*this); out |= f; return out; } template PX_INLINE PxFlags &PxFlags::operator&=(enumtype e) { mBits &= static_cast(e); return *this; } template PX_INLINE PxFlags &PxFlags::operator&=(const PxFlags &f) { mBits &= f.mBits; return *this; } template PX_INLINE PxFlags PxFlags::operator&(enumtype e) const { PxFlags out = *this; out.mBits &= static_cast(e); return out; } template PX_INLINE PxFlags PxFlags::operator& (const PxFlags &f) const { PxFlags out = *this; out.mBits &= f.mBits; return out; } template PX_INLINE PxFlags &PxFlags::operator^=(enumtype e) { mBits ^= static_cast(e); return *this; } template PX_INLINE PxFlags &PxFlags::operator^=(const PxFlags &f) { mBits ^= f.mBits; return *this; } template PX_INLINE PxFlags PxFlags::operator^ (enumtype e) const { PxFlags out = *this; out.mBits ^= static_cast(e); return out; } template PX_INLINE PxFlags PxFlags::operator^ (const PxFlags &f) const { PxFlags out = *this; out.mBits ^= f.mBits; return out; } template PX_INLINE PxFlags PxFlags::operator~ (void) const { PxFlags out; out.mBits = ~mBits; return out; } template PX_INLINE PxFlags::operator bool(void) const { return mBits ? true : false; } template PX_INLINE PxFlags::operator PxU8(void) const { return static_cast(mBits); } template PX_INLINE PxFlags::operator PxU16(void) const { return static_cast(mBits); } template PX_INLINE PxFlags::operator PxU32(void) const { return static_cast(mBits); } template PX_INLINE void PxFlags::clear(enumtype e) { mBits &= ~static_cast(e); } #ifndef PX_DOXYGEN } // namespace physx #endif /** @} */ #endif // #ifndef PX_FOUNDATION_PX_FLAGS_H