// 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-2014 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 NV_NVFOUNDATION_NVFLAGS_H #define NV_NVFOUNDATION_NVFLAGS_H /** \addtogroup foundation @{ */ #include "Nv.h" #if !NV_DOXYGEN namespace nvidia { #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. NV_FLAGS_OPERATORS(MyEnum::Enum, uint8_t); NvFlags myFlags; myFlags |= MyEnum::eMAN; myFlags |= MyEnum::eBEAR | MyEnum::ePIG; if(myFlags & MyEnum::eBEAR) { doSomething(); } */ template class NvFlags { public: typedef storagetype InternalType; NV_INLINE explicit NvFlags(const NvEMPTY) { } NV_INLINE NvFlags(void); NV_INLINE NvFlags(enumtype e); NV_INLINE NvFlags(const NvFlags& f); NV_INLINE explicit NvFlags(storagetype b); NV_INLINE bool isSet(enumtype e) const; NV_INLINE NvFlags& set(enumtype e); NV_INLINE bool operator==(enumtype e) const; NV_INLINE bool operator==(const NvFlags& f) const; NV_INLINE bool operator==(bool b) const; NV_INLINE bool operator!=(enumtype e) const; NV_INLINE bool operator!=(const NvFlags& f) const; NV_INLINE NvFlags& operator=(const NvFlags& f); NV_INLINE NvFlags& operator=(enumtype e); NV_INLINE NvFlags& operator|=(enumtype e); NV_INLINE NvFlags& operator|=(const NvFlags& f); NV_INLINE NvFlags operator|(enumtype e) const; NV_INLINE NvFlags operator|(const NvFlags& f) const; NV_INLINE NvFlags& operator&=(enumtype e); NV_INLINE NvFlags& operator&=(const NvFlags& f); NV_INLINE NvFlags operator&(enumtype e) const; NV_INLINE NvFlags operator&(const NvFlags& f) const; NV_INLINE NvFlags& operator^=(enumtype e); NV_INLINE NvFlags& operator^=(const NvFlags& f); NV_INLINE NvFlags operator^(enumtype e) const; NV_INLINE NvFlags operator^(const NvFlags& f) const; NV_INLINE NvFlags operator~(void) const; NV_INLINE operator bool(void) const; NV_INLINE operator uint8_t(void) const; NV_INLINE operator uint16_t(void) const; NV_INLINE operator uint32_t(void) const; NV_INLINE void clear(enumtype e); public: friend NV_INLINE NvFlags operator&(enumtype a, NvFlags& b) { NvFlags out; out.mBits = a & b.mBits; return out; } private: storagetype mBits; }; #define NV_FLAGS_OPERATORS(enumtype, storagetype) \ NV_INLINE NvFlags operator|(enumtype a, enumtype b) \ { \ NvFlags r(a); \ r |= b; \ return r; \ } \ NV_INLINE NvFlags operator&(enumtype a, enumtype b) \ { \ NvFlags r(a); \ r &= b; \ return r; \ } \ NV_INLINE NvFlags operator~(enumtype a) \ { \ return ~NvFlags(a); \ } #define NV_FLAGS_TYPEDEF(x, y) \ typedef NvFlags x##s; \ NV_FLAGS_OPERATORS(x::Enum, y) template NV_INLINE NvFlags::NvFlags(void) { mBits = 0; } template NV_INLINE NvFlags::NvFlags(enumtype e) { mBits = static_cast(e); } template NV_INLINE NvFlags::NvFlags(const NvFlags& f) { mBits = f.mBits; } template NV_INLINE NvFlags::NvFlags(storagetype b) { mBits = b; } template NV_INLINE bool NvFlags::isSet(enumtype e) const { return (mBits & static_cast(e)) == static_cast(e); } template NV_INLINE NvFlags& NvFlags::set(enumtype e) { mBits = static_cast(e); return *this; } template NV_INLINE bool NvFlags::operator==(enumtype e) const { return mBits == static_cast(e); } template NV_INLINE bool NvFlags::operator==(const NvFlags& f) const { return mBits == f.mBits; } template NV_INLINE bool NvFlags::operator==(bool b) const { return bool(*this) == b; } template NV_INLINE bool NvFlags::operator!=(enumtype e) const { return mBits != static_cast(e); } template NV_INLINE bool NvFlags::operator!=(const NvFlags& f) const { return mBits != f.mBits; } template NV_INLINE NvFlags& NvFlags::operator=(enumtype e) { mBits = static_cast(e); return *this; } template NV_INLINE NvFlags& NvFlags::operator=(const NvFlags& f) { mBits = f.mBits; return *this; } template NV_INLINE NvFlags& NvFlags::operator|=(enumtype e) { mBits |= static_cast(e); return *this; } template NV_INLINE NvFlags& NvFlags:: operator|=(const NvFlags& f) { mBits |= f.mBits; return *this; } template NV_INLINE NvFlags NvFlags::operator|(enumtype e) const { NvFlags out(*this); out |= e; return out; } template NV_INLINE NvFlags NvFlags:: operator|(const NvFlags& f) const { NvFlags out(*this); out |= f; return out; } template NV_INLINE NvFlags& NvFlags::operator&=(enumtype e) { mBits &= static_cast(e); return *this; } template NV_INLINE NvFlags& NvFlags:: operator&=(const NvFlags& f) { mBits &= f.mBits; return *this; } template NV_INLINE NvFlags NvFlags::operator&(enumtype e) const { NvFlags out = *this; out.mBits &= static_cast(e); return out; } template NV_INLINE NvFlags NvFlags:: operator&(const NvFlags& f) const { NvFlags out = *this; out.mBits &= f.mBits; return out; } template NV_INLINE NvFlags& NvFlags::operator^=(enumtype e) { mBits ^= static_cast(e); return *this; } template NV_INLINE NvFlags& NvFlags:: operator^=(const NvFlags& f) { mBits ^= f.mBits; return *this; } template NV_INLINE NvFlags NvFlags::operator^(enumtype e) const { NvFlags out = *this; out.mBits ^= static_cast(e); return out; } template NV_INLINE NvFlags NvFlags:: operator^(const NvFlags& f) const { NvFlags out = *this; out.mBits ^= f.mBits; return out; } template NV_INLINE NvFlags NvFlags::operator~(void) const { NvFlags out; out.mBits = storagetype(~mBits); return out; } template NV_INLINE NvFlags::operator bool(void) const { return mBits ? true : false; } template NV_INLINE NvFlags::operator uint8_t(void) const { return static_cast(mBits); } template NV_INLINE NvFlags::operator uint16_t(void) const { return static_cast(mBits); } template NV_INLINE NvFlags::operator uint32_t(void) const { return static_cast(mBits); } template NV_INLINE void NvFlags::clear(enumtype e) { mBits &= ~static_cast(e); } #if !NV_DOXYGEN } // namespace nvidia #endif /** @} */ #endif // #ifndef NV_NVFOUNDATION_NVFLAGS_H