11
11
12
12
// ---------------------------------------------------------
13
13
// BitFieldMember<>: Used internally by ADD_BITFIELD_MEMBER macro.
14
+ // All members are public to simplify compliance with sections 9.0.7 and
15
+ // 9.5.1 of the C++11 standard, thereby avoiding undefined behavior.
14
16
// ---------------------------------------------------------
15
- template <class T , int Offset, int Bits>
16
- class BitFieldMember
17
+ template <typename T, int Offset, int Bits>
18
+ struct BitFieldMember
17
19
{
18
- private:
19
20
static_assert (Offset + Bits <= (int ) sizeof (T) * 8 , " Member exceeds bitfield boundaries" );
20
21
static_assert (Bits < (int ) sizeof (T) * 8 , " Can't fill entire bitfield with one member" );
21
22
22
23
static const T Maximum = (T(1 ) << Bits) - 1 ;
23
24
static const T Mask = Maximum << Offset;
24
-
25
- T value;
26
-
27
- public:
28
25
T maximum () const { return Maximum; }
29
26
T one () const { return T (1 ) << Offset; }
30
27
28
+ T value;
29
+
31
30
operator T () const
32
31
{
33
32
return (value >> Offset) & Maximum;
@@ -63,15 +62,18 @@ class BitFieldMember
63
62
64
63
// ---------------------------------------------------------
65
64
// BitFieldArray<>: Used internally by ADD_BITFIELD_ARRAY macro.
65
+ // All members are public to simplify compliance with sections 9.0.7 and
66
+ // 9.5.1 of the C++11 standard, thereby avoiding undefined behavior.
66
67
// ---------------------------------------------------------
67
- template <class T , int BaseOffset, int BitsPerItem, int NumItems>
68
- class BitFieldArray
68
+ template <typename T, int BaseOffset, int BitsPerItem, int NumItems>
69
+ struct BitFieldArray
69
70
{
70
- private:
71
71
static_assert (BaseOffset + BitsPerItem * NumItems <= (int ) sizeof (T) * 8 , " Array exceeds bitfield boundaries" );
72
72
static_assert (BitsPerItem < (int ) sizeof (T) * 8 , " Can't fill entire bitfield with one array element" );
73
73
74
74
static const T Maximum = (T(1 ) << BitsPerItem) - 1 ;
75
+ T maximum () const { return Maximum; }
76
+ int numItems () const { return NumItems; }
75
77
76
78
T value;
77
79
@@ -117,10 +119,6 @@ class BitFieldArray
117
119
Element& operator --(int ) { return *this -= 1 ; } // postfix form
118
120
};
119
121
120
- public:
121
- T maximum () const { return Maximum; }
122
- int numItems () const { return NumItems; }
123
-
124
122
Element operator [](int i)
125
123
{
126
124
assert (i >= 0 && i < NumItems); // array index must be in range
@@ -138,27 +136,29 @@ class BitFieldArray
138
136
// ---------------------------------------------------------
139
137
// Bitfield definition macros.
140
138
// For usage examples, see RWLock and LockReducedDiningPhilosophers.
139
+ // All members are public to simplify compliance with sections 9.0.7 and
140
+ // 9.5.1 of the C++11 standard, thereby avoiding undefined behavior.
141
141
// ---------------------------------------------------------
142
142
#define BEGIN_BITFIELD_TYPE (typeName, T ) \
143
143
union typeName \
144
144
{ \
145
- private: \
146
- typedef T _IntType; \
147
- T value; \
148
- public: \
149
- typeName (T v = 0 ) : value (v) {} \
150
- typeName& operator =(T v) { value = v; return *this ; } \
151
- operator T&() { return value; } \
152
- operator T () const { return value; }
145
+ struct Wrapper { T value; }; \
146
+ Wrapper wrapper; \
147
+ typeName (T v = 0 ) { wrapper.value = v; } \
148
+ typeName& operator =(T v) { wrapper.value = v; return *this ; } \
149
+ operator T&() { return wrapper.value ; } \
150
+ operator T () const { return wrapper.value ; } \
151
+ typedef T StorageType;
153
152
154
153
#define ADD_BITFIELD_MEMBER (memberName, offset, bits ) \
155
- BitFieldMember<_IntType , offset, bits> memberName;
154
+ BitFieldMember<StorageType , offset, bits> memberName;
156
155
157
156
#define ADD_BITFIELD_ARRAY (memberName, offset, bits, numItems ) \
158
- BitFieldArray<_IntType , offset, bits, numItems> memberName;
157
+ BitFieldArray<StorageType , offset, bits, numItems> memberName;
159
158
160
159
#define END_BITFIELD_TYPE () \
161
160
};
162
161
163
162
164
163
#endif // __CPP11OM_BITFIELD_H__
164
+
0 commit comments