epoc32/include/babitflags.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100 (2010-03-31)
branchSymbian3
changeset 4 837f303aceeb
parent 2 2fe1408b6811
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@4
     4
// under the terms of "Eclipse Public License v1.0"
williamr@2
     5
// which accompanies this distribution, and is available
williamr@4
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
#ifndef __BABITFLAGS_H__
williamr@2
    17
#define __BABITFLAGS_H__
williamr@2
    18
williamr@2
    19
// System includes
williamr@2
    20
#include <e32std.h>
williamr@2
    21
williamr@4
    22
//
williamr@2
    23
// ----> TBitFlagsT (header)
williamr@4
    24
//
williamr@2
    25
template <class T>
williamr@2
    26
class TBitFlagsT
williamr@2
    27
/**
williamr@2
    28
A simple class which manages the process of setting and clearing
williamr@2
    29
flags in an abstract fashion.
williamr@2
    30
@publishedAll
williamr@2
    31
@released
williamr@2
    32
*/
williamr@2
    33
	{
williamr@4
    34
//
williamr@2
    35
public:										// CONSTRUCT
williamr@4
    36
//
williamr@2
    37
williamr@2
    38
	/**
williamr@2
    39
	 * Default constructor - initialize all flags to zero
williamr@2
    40
	 */
williamr@2
    41
	inline TBitFlagsT();
williamr@2
    42
williamr@2
    43
	/**
williamr@2
    44
	 * Initialize the whole flag to a certain value
williamr@2
    45
	 */
williamr@2
    46
	inline TBitFlagsT(T aFlags);
williamr@2
    47
williamr@2
    48
	/**
williamr@2
    49
	 * Copy constructor - initialize this flag object to mirror
williamr@2
    50
	 * that of aFlags.
williamr@2
    51
	 */
williamr@2
    52
	inline TBitFlagsT(const TBitFlagsT& aFlags);
williamr@2
    53
williamr@4
    54
//
williamr@2
    55
public:										// MANIPULATORS
williamr@4
    56
//
williamr@2
    57
williamr@2
    58
	/**
williamr@2
    59
	 * Set all the flags
williamr@2
    60
	 */
williamr@2
    61
	inline void								SetAll();
williamr@2
    62
williamr@2
    63
	/**
williamr@2
    64
	 * Clear all the flags
williamr@2
    65
	 */
williamr@2
    66
	inline void								ClearAll();
williamr@2
    67
williamr@2
    68
	/**
williamr@2
    69
	 * Set a particular flag
williamr@2
    70
	 */
williamr@2
    71
	inline void								Set(TInt aFlagIndex);
williamr@2
    72
williamr@2
    73
	/**
williamr@2
    74
	 * Clear a particular flag
williamr@2
    75
	 */
williamr@2
    76
	inline void								Clear(TInt aFlagIndex);
williamr@2
    77
williamr@2
    78
	/**
williamr@2
    79
	 * Set or clear a particular flag 
williamr@2
    80
	 * 
williamr@2
    81
	 * If aValue is 1, then the flag is set
williamr@2
    82
	 * If aValue is 0, then the flag is cleared
williamr@2
    83
	 */
williamr@2
    84
	inline void								Assign(TInt aFlagIndex, TBool aValue);
williamr@2
    85
williamr@2
    86
	/**
williamr@2
    87
	 * Change the state of a particular flag. If the flag at the specified
williamr@2
    88
	 * index was clear, then it becomes set, otherwise it becomes clear.
williamr@2
    89
	 */
williamr@2
    90
	inline void								Toggle(TInt aFlagIndex);
williamr@2
    91
williamr@4
    92
//
williamr@2
    93
public:										// OPERATORS
williamr@4
    94
//
williamr@2
    95
williamr@2
    96
	/**
williamr@2
    97
	 * Check if a particular flag is set or not
williamr@2
    98
	 *
williamr@2
    99
	 * @return A boolean indicating whether the specified flag is set or clear
williamr@2
   100
	 */
williamr@2
   101
	inline TBool							operator[](TInt aFlagIndex) const;
williamr@2
   102
williamr@2
   103
	/**
williamr@2
   104
	 * Assignment operator - assign specific value to the whole flag, replacing
williamr@2
   105
	 * any existing value.
williamr@2
   106
	 */
williamr@2
   107
	inline TBitFlagsT&						operator=(const TBitFlagsT& aFlags);
williamr@2
   108
williamr@2
   109
	/**
williamr@2
   110
	 * Compare the value of the whole flag with a given value.
williamr@2
   111
	 *
williamr@2
   112
	 * @return A boolean indicating whether the two flags are identical.
williamr@2
   113
	 */
williamr@2
   114
	inline TBool							operator==(const TBitFlagsT& aFlags);
williamr@2
   115
williamr@4
   116
//
williamr@2
   117
public:										// ACCESS
williamr@4
   118
//
williamr@2
   119
williamr@2
   120
	/**
williamr@2
   121
	 * Check if a particular flag is set
williamr@2
   122
	 */
williamr@2
   123
	inline TBool							IsSet(TInt aFlagIndex) const;
williamr@2
   124
williamr@2
   125
	/**
williamr@2
   126
	 * Check if a particular flag is clear
williamr@2
   127
	 */
williamr@2
   128
	inline TBool							IsClear(TInt aFlagIndex) const;
williamr@2
   129
williamr@2
   130
	/**
williamr@2
   131
	 * Access the underlying value of the flag.
williamr@2
   132
	 */
williamr@2
   133
	inline T								Value() const { return iFlags; }
williamr@2
   134
williamr@2
   135
	/**
williamr@2
   136
	 * Assign a new value (directly) to this flag object. Replaces any
williamr@2
   137
	 * existing individual flag settings.
williamr@2
   138
	 */
williamr@2
   139
	inline void								SetValue(T aFlags) { iFlags = aFlags; }
williamr@2
   140
williamr@4
   141
//
williamr@2
   142
private:									// INTERNAL
williamr@4
   143
//
williamr@2
   144
williamr@2
   145
	/**
williamr@2
   146
	 * Generate a mask for a particular flag
williamr@2
   147
	 */
williamr@2
   148
	inline T								FlagMask(TInt aFlagIndex) const;
williamr@2
   149
williamr@4
   150
//
williamr@2
   151
public:										// MEMBER DATA
williamr@4
   152
//
williamr@2
   153
	
williamr@2
   154
	// The underlying object container which represents the flags.
williamr@2
   155
	T										iFlags;
williamr@2
   156
	};
williamr@2
   157
williamr@2
   158
/**
williamr@2
   159
Type definitions
williamr@2
   160
@publishedAll
williamr@2
   161
@released
williamr@2
   162
*/
williamr@2
   163
typedef TBitFlagsT<TUint8> TBitFlags8;
williamr@2
   164
//
williamr@2
   165
williamr@2
   166
/**
williamr@2
   167
Type definitions
williamr@2
   168
@publishedAll
williamr@2
   169
@released
williamr@2
   170
*/
williamr@2
   171
typedef TBitFlagsT<TUint16> TBitFlags16;
williamr@2
   172
//
williamr@2
   173
williamr@2
   174
/**
williamr@2
   175
Type definitions
williamr@2
   176
@publishedAll
williamr@2
   177
@released
williamr@2
   178
*/
williamr@2
   179
typedef TBitFlagsT<TUint32>	TBitFlags32;
williamr@2
   180
//
williamr@2
   181
williamr@2
   182
williamr@2
   183
typedef TBitFlags32 TBitFlags;
williamr@2
   184
williamr@2
   185
williamr@4
   186
//
williamr@2
   187
// ----> TBitFlagsT (inlines)
williamr@4
   188
//
williamr@2
   189
template <class T>
williamr@2
   190
inline TBitFlagsT<T>::TBitFlagsT() : iFlags(T(0)) 
williamr@2
   191
	{}
williamr@2
   192
williamr@2
   193
template <class T>
williamr@2
   194
inline TBitFlagsT<T>::TBitFlagsT(T aFlags) : iFlags(aFlags) 
williamr@2
   195
	{}
williamr@2
   196
williamr@2
   197
template <class T>
williamr@2
   198
inline TBitFlagsT<T>::TBitFlagsT(const TBitFlagsT<T>& aFlags) : iFlags(aFlags.iFlags) 
williamr@2
   199
	{}
williamr@2
   200
williamr@2
   201
template <class T>
williamr@2
   202
inline T TBitFlagsT<T>::FlagMask(TInt aFlagIndex) const
williamr@2
   203
	{ return T(T(1)<<aFlagIndex); }
williamr@2
   204
williamr@2
   205
template <class T>
williamr@2
   206
inline TBool TBitFlagsT<T>::IsSet(TInt aFlagIndex) const
williamr@4
   207
	{ 
williamr@4
   208
	// All out-of-range values should return  false
williamr@4
   209
	if(aFlagIndex <= ((sizeof(T)<<3)-1) )
williamr@4
   210
		{
williamr@4
   211
		return iFlags & FlagMask(aFlagIndex);
williamr@4
   212
		}
williamr@4
   213
	else
williamr@4
   214
		{
williamr@4
   215
		return EFalse;
williamr@4
   216
		}
williamr@4
   217
	 
williamr@4
   218
	}
williamr@2
   219
williamr@2
   220
template <class T>
williamr@2
   221
inline TBool TBitFlagsT<T>::IsClear(TInt aFlagIndex) const
williamr@2
   222
	{ return !IsSet(aFlagIndex); }
williamr@2
   223
williamr@2
   224
template <class T>
williamr@2
   225
inline void TBitFlagsT<T>::Set(TInt aFlagIndex)
williamr@2
   226
	{ iFlags = T(iFlags | FlagMask(aFlagIndex)); }
williamr@2
   227
williamr@2
   228
template <class T>
williamr@2
   229
inline void TBitFlagsT<T>::Clear(TInt aFlagIndex)
williamr@2
   230
	{ iFlags = T(iFlags & ~(FlagMask(aFlagIndex))); }
williamr@2
   231
williamr@2
   232
template <class T>
williamr@2
   233
inline void TBitFlagsT<T>::Assign(TInt aFlagIndex, TBool aVal)
williamr@2
   234
	{ if (aVal) Set(aFlagIndex); else Clear(aFlagIndex); }
williamr@2
   235
williamr@2
   236
template <class T>
williamr@2
   237
inline void TBitFlagsT<T>::Toggle(TInt aFlagIndex)
williamr@2
   238
	{ iFlags = T(iFlags^FlagMask(aFlagIndex)); }
williamr@2
   239
williamr@2
   240
template <class T>
williamr@2
   241
inline TBool TBitFlagsT<T>::operator[](TInt aFlagIndex) const
williamr@2
   242
	{ return IsSet(aFlagIndex); }
williamr@2
   243
williamr@2
   244
template <class T>
williamr@2
   245
inline TBitFlagsT<T>& TBitFlagsT<T>::operator=(const TBitFlagsT<T>& aFlags)
williamr@2
   246
	{ iFlags = aFlags.iFlags; return *this; }
williamr@2
   247
williamr@2
   248
template <class T>
williamr@2
   249
inline TBool TBitFlagsT<T>::operator==(const TBitFlagsT<T>& aFlags)
williamr@2
   250
	{ return iFlags == aFlags.Value(); }
williamr@2
   251
williamr@2
   252
template <class T>
williamr@2
   253
inline void TBitFlagsT<T>::SetAll()
williamr@2
   254
	{ iFlags = T(~(T(0))); }
williamr@2
   255
williamr@2
   256
template <class T>
williamr@2
   257
inline void TBitFlagsT<T>::ClearAll()
williamr@2
   258
	{ iFlags = T(0); }
williamr@2
   259
williamr@2
   260
williamr@2
   261
#endif