// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright (c) 2008-2023 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_FLAGS_H #define PX_FLAGS_H /** \addtogroup foundation @{ */ #include "foundation/Px.h" #if !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, uint8_t); PxFlags myFlags; myFlags |= MyEnum::eMAN; myFlags |= MyEnum::eBEAR | MyEnum::ePIG; if(myFlags & MyEnum::eBEAR) { doSomething(); } */ template class PxFlags { public: typedef storagetype InternalType; PX_CUDA_CALLABLE PX_INLINE explicit PxFlags(const PxEMPTY) { } PX_CUDA_CALLABLE PX_INLINE PxFlags(void); PX_CUDA_CALLABLE PX_INLINE PxFlags(enumtype e); PX_CUDA_CALLABLE PX_INLINE PxFlags(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE explicit PxFlags(storagetype b); PX_CUDA_CALLABLE PX_INLINE bool operator==(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE bool operator==(bool b) const; PX_CUDA_CALLABLE PX_INLINE bool operator!=(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE bool operator!=(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE PxFlags& operator=(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE PxFlags& operator=(enumtype e); PX_CUDA_CALLABLE PX_INLINE PxFlags& operator|=(enumtype e); PX_CUDA_CALLABLE PX_INLINE PxFlags& operator|=(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE PxFlags operator|(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE PxFlags operator|(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE PxFlags& operator&=(enumtype e); PX_CUDA_CALLABLE PX_INLINE PxFlags& operator&=(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE PxFlags operator&(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE PxFlags operator&(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE PxFlags& operator^=(enumtype e); PX_CUDA_CALLABLE PX_INLINE PxFlags& operator^=(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE PxFlags operator^(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE PxFlags operator^(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE PxFlags operator~(void) const; PX_CUDA_CALLABLE PX_INLINE operator bool(void) const; PX_CUDA_CALLABLE PX_INLINE operator uint8_t(void) const; PX_CUDA_CALLABLE PX_INLINE operator uint16_t(void) const; PX_CUDA_CALLABLE PX_INLINE operator uint32_t(void) const; PX_CUDA_CALLABLE PX_INLINE void clear(enumtype e); PX_CUDA_CALLABLE PX_INLINE void raise(enumtype e); PX_CUDA_CALLABLE PX_INLINE bool isSet(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE PxFlags& setAll(enumtype e); public: friend PX_INLINE PxFlags operator&(enumtype a, PxFlags& b) { PxFlags out; out.mBits = a & b.mBits; return out; } private: storagetype mBits; }; #if !PX_DOXYGEN #define PX_FLAGS_OPERATORS(enumtype, storagetype) \ PX_CUDA_CALLABLE PX_INLINE PxFlags operator|(enumtype a, enumtype b) \ { \ PxFlags r(a); \ r |= b; \ return r; \ } \ PX_CUDA_CALLABLE PX_INLINE PxFlags operator&(enumtype a, enumtype b) \ { \ PxFlags r(a); \ r &= b; \ return r; \ } \ PX_CUDA_CALLABLE PX_INLINE PxFlags operator~(enumtype a) \ { \ return ~PxFlags(a); \ } #define PX_FLAGS_TYPEDEF(x, y) \ typedef PxFlags x##s; \ PX_FLAGS_OPERATORS(x::Enum, y) template PX_CUDA_CALLABLE PX_INLINE PxFlags::PxFlags(void) { mBits = 0; } template PX_CUDA_CALLABLE PX_INLINE PxFlags::PxFlags(enumtype e) { mBits = static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE PxFlags::PxFlags(const PxFlags& f) { mBits = f.mBits; } template PX_CUDA_CALLABLE PX_INLINE PxFlags::PxFlags(storagetype b) { mBits = b; } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator==(enumtype e) const { return mBits == static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator==(const PxFlags& f) const { return mBits == f.mBits; } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator==(bool b) const { return bool(*this) == b; } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator!=(enumtype e) const { return mBits != static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator!=(const PxFlags& f) const { return mBits != f.mBits; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::operator=(enumtype e) { mBits = static_cast(e); return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::operator=(const PxFlags& f) { mBits = f.mBits; return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::operator|=(enumtype e) { mBits |= static_cast(e); return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags:: operator|=(const PxFlags& f) { mBits |= f.mBits; return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags::operator|(enumtype e) const { PxFlags out(*this); out |= e; return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags:: operator|(const PxFlags& f) const { PxFlags out(*this); out |= f; return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::operator&=(enumtype e) { mBits &= static_cast(e); return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags:: operator&=(const PxFlags& f) { mBits &= f.mBits; return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags::operator&(enumtype e) const { PxFlags out = *this; out.mBits &= static_cast(e); return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags:: operator&(const PxFlags& f) const { PxFlags out = *this; out.mBits &= f.mBits; return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::operator^=(enumtype e) { mBits ^= static_cast(e); return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags:: operator^=(const PxFlags& f) { mBits ^= f.mBits; return *this; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags::operator^(enumtype e) const { PxFlags out = *this; out.mBits ^= static_cast(e); return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags:: operator^(const PxFlags& f) const { PxFlags out = *this; out.mBits ^= f.mBits; return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags PxFlags::operator~(void) const { PxFlags out; out.mBits = storagetype(~mBits); return out; } template PX_CUDA_CALLABLE PX_INLINE PxFlags::operator bool(void) const { return mBits ? true : false; } template PX_CUDA_CALLABLE PX_INLINE PxFlags::operator uint8_t(void) const { return static_cast(mBits); } template PX_CUDA_CALLABLE PX_INLINE PxFlags::operator uint16_t(void) const { return static_cast(mBits); } template PX_CUDA_CALLABLE PX_INLINE PxFlags::operator uint32_t(void) const { return static_cast(mBits); } template PX_CUDA_CALLABLE PX_INLINE void PxFlags::clear(enumtype e) { mBits &= ~static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE void PxFlags::raise(enumtype e) { mBits |= static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::isSet(enumtype e) const { return (mBits & static_cast(e)) == static_cast(e); } template PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::setAll(enumtype e) { mBits = static_cast(e); return *this; } } // namespace physx #endif //!PX_DOXYGEN /** @} */ #endif