36d35
< //#include "base/misc.hh"
134,135c133
< template<class Data, int first, int last=first>
< class BitfieldBase
---
> namespace BitfieldBackend
137,142c135,136
< protected:
< uint8_t __data[sizeof(Data)];
<
< //These are defined here so it can be specialized for Data, but can be
< //hidden by RO and WO variants.
< inline uint64_t getBits(int _first, int _last)
---
> template<class Data>
> class BitfieldBase
144,147c138,139
< //build up the right bits from the byte array "data"
< //panic("Not yet implemented.\n");
< return 0;
< }
---
> protected:
> Data __data;
149,154c141,145
< inline void setBits(int _first, int _last, uint64_t val)
< {
< //Set the right bits from the byte array "data"
< //panic("Not yet implemented.\n");
< }
< };
---
> inline uint64_t
> getBits(int first, int last)
> {
> return bits(__data, first, last);
> }
156,160c147,152
< template<class Data, int first, int last=first>
< class BitfieldNativeBase
< {
< protected:
< Data __data;
---
> inline void
> setBits(int first, int last, uint64_t val)
> {
> replaceBits(__data, first, last, val);
> }
> };
162c154,155
< inline uint64_t getBits(int _first, int _last)
---
> template<class Type, class Base>
> class _BitfieldRO : public Base
164,165c157,162
< return bits(__data, first, last);
< }
---
> public:
> operator const Type ()
> {
> return *((Base *)this);
> }
> };
167c164,165
< inline void setBits(int _first, int _last, uint64_t val)
---
> template<class Type, class Base>
> class _BitfieldWO : public Base
169,171c167,173
< replaceBits(__data, first, last, val);
< }
< };
---
> public:
> const Type operator = (const Type & _data)
> {
> *((Base *)this) = _data;
> return _data;
> }
> };
173,217c175,176
< template <int first>
< class BitfieldBase<uint64_t, first, first> :
< public BitfieldNativeBase<uint64_t, first, first>
< {};
<
< template <int first, int last>
< class BitfieldBase<uint64_t, first, last> :
< public BitfieldNativeBase<uint64_t, first, last>
< {};
<
< template <int first>
< class BitfieldBase<uint32_t, first, first> :
< public BitfieldNativeBase<uint32_t, first, first>
< {};
<
< template <int first, int last>
< class BitfieldBase<uint32_t, first, last> :
< public BitfieldNativeBase<uint32_t, first, last>
< {};
<
< template <int first>
< class BitfieldBase<uint16_t, first, first> :
< public BitfieldNativeBase<uint16_t, first, first>
< {};
<
< template <int first, int last>
< class BitfieldBase<uint16_t, first, last> :
< public BitfieldNativeBase<uint16_t, first, last>
< {};
<
< template <int first>
< class BitfieldBase<uint8_t, first, first> :
< public BitfieldNativeBase<uint8_t, first, first>
< {};
<
< template <int first, int last>
< class BitfieldBase<uint8_t, first, last> :
< public BitfieldNativeBase<uint8_t, first, last>
< {};
<
< template<class Data, int first, int last=first>
< class _BitfieldRO : public BitfieldBase<Data, first, last>
< {
< public:
< operator const Data & ()
---
> template<class Data, int first, int last=first>
> class _Bitfield : public BitfieldBase<Data>
219,221c178,182
< return this->getBits(first, last);
< }
< };
---
> public:
> operator const Data ()
> {
> return this->getBits(first, last);
> }
223,232c184,190
< template<class Data, int first, int last=first>
< class _BitfieldWO : public BitfieldBase<Data, first, last>
< {
< public:
< const Data & operator = (const Data & _data)
< {
< this->setBits(first, last, _data);
< return *this;
< }
< };
---
> const Data
> operator = (const Data & _data)
> {
> this->setBits(first, last, _data);
> return _data;
> }
> };
234,238c192,193
< template<class Data, int first, int last=first>
< class _BitfieldRW : public BitfieldBase<Data, first, last>
< {
< public:
< operator const Data ()
---
> template <class Type, class Base>
> class BitUnionOperators : public Base
240,241c195,199
< return this->getBits(first, last);
< }
---
> public:
> operator const Type ()
> {
> return Base::__data;
> }
243,248c201,205
< const Data operator = (const Data & _data)
< {
< this->setBits(first, last, _data);
< return *this;
< }
< };
---
> const Type
> operator = (const Type & _data)
> {
> Base::__data = _data;
> }
250,257c207,211
< template <class Type, class Base>
< class BitUnionOperators : public Base
< {
< public:
< operator const Type ()
< {
< return Base::__data;
< }
---
> bool
> operator < (const Base & base)
> {
> return Base::__data < base.__data;
> }
259,262c213,219
< const Type operator = (const Type & _data)
< {
< Base::__data = _data;
< }
---
> bool
> operator == (const Base & base)
> {
> return Base::__data == base.__data;
> }
> };
> }
264,274d220
< bool operator < (const Base & base)
< {
< return Base::__data < base.__data;
< }
<
< bool operator == (const Base & base)
< {
< return Base::__data == base.__data;
< }
< };
<
276c222,226
< class __##name { \
---
> namespace BitfieldUnderlyingClasses \
> { \
> class name; \
> } \
> class BitfieldUnderlyingClasses::name { \
285c235,237
< typedef BitUnionOperators<__##name::__DataType, __##name> name;
---
> typedef BitfieldBackend::BitUnionOperators< \
> BitfieldUnderlyingClasses::name::__DataType, \
> BitfieldUnderlyingClasses::name> name;
298,303c250,251
< //Regular read/write bitfields
< #define BitfieldRW(first, last) _BitfieldRW<__DataType, first, last>
< #define SubBitUnionRW(name, first, last) \
< __SubBitUnion(BitfieldRW(first, last), name)
< #define Bitfield(first, last) BitfieldRW(first, last)
< #define SubBitUnion(name, first, last) SubBitUnionRW(name, first, last)
---
> //This is so we can send in parameters with commas
> #define wrap(guts) guts
306,308c254,257
< #define BitfieldRO(first, last) _BitfieldRO<__DataType, first, last>
< #define SubBitUnionRO(name, first, last) \
< __SubBitUnion(BitfieldRO(first, last), name)
---
> #define __BitfieldRO(base) \
> BitfieldBackend::_BitfieldRO<__DataType, base>
> #define __SubBitUnionRO(name, base) \
> __SubBitUnion(wrap(_BitfieldRO<__DataType, base>), name)
311c260,273
< #define BitfieldWO(first, last) _BitfieldWO<__DataType, first, last>
---
> #define __BitfieldWO(base) \
> BitfieldBackend::_BitfieldWO<__DataType, base>
> #define __SubBitUnionWO(name, base) \
> __SubBitUnion(wrap(_BitfieldWO<__DataType, base>), name)
>
> //Regular bitfields
> #define Bitfield(first, last) \
> BitfieldBackend::_Bitfield<__DataType, first, last>
> #define SubBitUnion(name, first, last) \
> __SubBitUnion(Bitfield(first, last), name)
> #define BitfieldRO(first, last) __BitfieldRO(Bitfield(first, last))
> #define SubBitUnionRO(name, first, last) \
> __SubBitUnionRO(Bitfield(first, last), name)
> #define BitfieldWO(first, last) __BitfieldWO(Bitfield(first, last))
313c275
< __SubBitUnion(BitfieldWO(first, last), name)
---
> __SubBitUnionWO(Bitfield(first, last), name)