williamr@2: // Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __BABITFLAGS_H__ williamr@2: #define __BABITFLAGS_H__ williamr@2: williamr@2: // System includes williamr@2: #include williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: // ----> TBitFlagsT (header) williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: template williamr@2: class TBitFlagsT williamr@2: /** williamr@2: A simple class which manages the process of setting and clearing williamr@2: flags in an abstract fashion. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: public: // CONSTRUCT williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: /** williamr@2: * Default constructor - initialize all flags to zero williamr@2: */ williamr@2: inline TBitFlagsT(); williamr@2: williamr@2: /** williamr@2: * Initialize the whole flag to a certain value williamr@2: */ williamr@2: inline TBitFlagsT(T aFlags); williamr@2: williamr@2: /** williamr@2: * Copy constructor - initialize this flag object to mirror williamr@2: * that of aFlags. williamr@2: */ williamr@2: inline TBitFlagsT(const TBitFlagsT& aFlags); williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: public: // MANIPULATORS williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: /** williamr@2: * Set all the flags williamr@2: */ williamr@2: inline void SetAll(); williamr@2: williamr@2: /** williamr@2: * Clear all the flags williamr@2: */ williamr@2: inline void ClearAll(); williamr@2: williamr@2: /** williamr@2: * Set a particular flag williamr@2: */ williamr@2: inline void Set(TInt aFlagIndex); williamr@2: williamr@2: /** williamr@2: * Clear a particular flag williamr@2: */ williamr@2: inline void Clear(TInt aFlagIndex); williamr@2: williamr@2: /** williamr@2: * Set or clear a particular flag williamr@2: * williamr@2: * If aValue is 1, then the flag is set williamr@2: * If aValue is 0, then the flag is cleared williamr@2: */ williamr@2: inline void Assign(TInt aFlagIndex, TBool aValue); williamr@2: williamr@2: /** williamr@2: * Change the state of a particular flag. If the flag at the specified williamr@2: * index was clear, then it becomes set, otherwise it becomes clear. williamr@2: */ williamr@2: inline void Toggle(TInt aFlagIndex); williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: public: // OPERATORS williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: /** williamr@2: * Check if a particular flag is set or not williamr@2: * williamr@2: * @return A boolean indicating whether the specified flag is set or clear williamr@2: */ williamr@2: inline TBool operator[](TInt aFlagIndex) const; williamr@2: williamr@2: /** williamr@2: * Assignment operator - assign specific value to the whole flag, replacing williamr@2: * any existing value. williamr@2: */ williamr@2: inline TBitFlagsT& operator=(const TBitFlagsT& aFlags); williamr@2: williamr@2: /** williamr@2: * Compare the value of the whole flag with a given value. williamr@2: * williamr@2: * @return A boolean indicating whether the two flags are identical. williamr@2: */ williamr@2: inline TBool operator==(const TBitFlagsT& aFlags); williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: public: // ACCESS williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: /** williamr@2: * Check if a particular flag is set williamr@2: */ williamr@2: inline TBool IsSet(TInt aFlagIndex) const; williamr@2: williamr@2: /** williamr@2: * Check if a particular flag is clear williamr@2: */ williamr@2: inline TBool IsClear(TInt aFlagIndex) const; williamr@2: williamr@2: /** williamr@2: * Access the underlying value of the flag. williamr@2: */ williamr@2: inline T Value() const { return iFlags; } williamr@2: williamr@2: /** williamr@2: * Assign a new value (directly) to this flag object. Replaces any williamr@2: * existing individual flag settings. williamr@2: */ williamr@2: inline void SetValue(T aFlags) { iFlags = aFlags; } williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: private: // INTERNAL williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: /** williamr@2: * Generate a mask for a particular flag williamr@2: */ williamr@2: inline T FlagMask(TInt aFlagIndex) const; williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: public: // MEMBER DATA williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: // The underlying object container which represents the flags. williamr@2: T iFlags; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Type definitions williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef TBitFlagsT TBitFlags8; williamr@2: // williamr@2: williamr@2: /** williamr@2: Type definitions williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef TBitFlagsT TBitFlags16; williamr@2: // williamr@2: williamr@2: /** williamr@2: Type definitions williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef TBitFlagsT TBitFlags32; williamr@2: // williamr@2: williamr@2: williamr@2: typedef TBitFlags32 TBitFlags; williamr@2: williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: // ----> TBitFlagsT (inlines) williamr@2: /////////////////////////////////////////////////////////////////////////////////////// williamr@2: template williamr@2: inline TBitFlagsT::TBitFlagsT() : iFlags(T(0)) williamr@2: {} williamr@2: williamr@2: template williamr@2: inline TBitFlagsT::TBitFlagsT(T aFlags) : iFlags(aFlags) williamr@2: {} williamr@2: williamr@2: template williamr@2: inline TBitFlagsT::TBitFlagsT(const TBitFlagsT& aFlags) : iFlags(aFlags.iFlags) williamr@2: {} williamr@2: williamr@2: template williamr@2: inline T TBitFlagsT::FlagMask(TInt aFlagIndex) const williamr@2: { return T(T(1)< williamr@2: inline TBool TBitFlagsT::IsSet(TInt aFlagIndex) const williamr@2: { return iFlags & FlagMask(aFlagIndex); } williamr@2: williamr@2: template williamr@2: inline TBool TBitFlagsT::IsClear(TInt aFlagIndex) const williamr@2: { return !IsSet(aFlagIndex); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::Set(TInt aFlagIndex) williamr@2: { iFlags = T(iFlags | FlagMask(aFlagIndex)); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::Clear(TInt aFlagIndex) williamr@2: { iFlags = T(iFlags & ~(FlagMask(aFlagIndex))); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::Assign(TInt aFlagIndex, TBool aVal) williamr@2: { if (aVal) Set(aFlagIndex); else Clear(aFlagIndex); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::Toggle(TInt aFlagIndex) williamr@2: { iFlags = T(iFlags^FlagMask(aFlagIndex)); } williamr@2: williamr@2: template williamr@2: inline TBool TBitFlagsT::operator[](TInt aFlagIndex) const williamr@2: { return IsSet(aFlagIndex); } williamr@2: williamr@2: template williamr@2: inline TBitFlagsT& TBitFlagsT::operator=(const TBitFlagsT& aFlags) williamr@2: { iFlags = aFlags.iFlags; return *this; } williamr@2: williamr@2: template williamr@2: inline TBool TBitFlagsT::operator==(const TBitFlagsT& aFlags) williamr@2: { return iFlags == aFlags.Value(); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::SetAll() williamr@2: { iFlags = T(~(T(0))); } williamr@2: williamr@2: template williamr@2: inline void TBitFlagsT::ClearAll() williamr@2: { iFlags = T(0); } williamr@2: williamr@2: williamr@2: #endif