35#include <basictypes.h>
39void ser_putstring(
const char *);
40void ser_putword(uint32_t);
41void ser_putbyte(uint8_t);
42template<u
int8_t e, u
int8_t s, u
int8_t w>
45 static_assert(e >= s,
"Ending bit must be after starting bit");
46 static_assert(e < w,
"Ending bit must be less than mapped width");
49 inline uint32_t asVal()
63#pragma GCC diagnostic push
64#pragma GCC diagnostic ignored "-Wshift-count-overflow"
65 return (*((uint32_t *)
this) >> s) & ((1UL << (e - s + 1)) - 1);
66#pragma GCC diagnostic pop
68 inline operator uint32_t() {
return asVal(); }
69 inline uint32_t operator=(uint32_t rhs)
71#pragma GCC diagnostic push
72#pragma GCC diagnostic ignored "-Wshift-count-overflow"
73 register uint32_t mask = ((1UL << (e - s + 1)) - 1);
74#pragma GCC diagnostic pop
75 *((uint32_t *)
this) &= ~(mask << s);
76 *((uint32_t *)
this) |= (rhs & mask) << s;
79 inline bool operator==(uint32_t rhs) {
return asVal() == rhs; }
80 inline bool operator>=(uint32_t rhs) {
return asVal() >= rhs; }
81 inline bool operator<(uint32_t rhs) {
return asVal() < rhs; }
82 inline uint32_t operator<<(uint32_t rhs) {
return asVal() << rhs; }
83 inline uint32_t operator*(uint32_t rhs) {
return asVal() * rhs; }
85} __attribute__((packed));
87template<u
int8_t e, u
int8_t s, u
int8_t w>
88inline uint32_t operator*(bit_overlay<e, s, w> lhs, uint32_t rhs)
90 return lhs.asVal() * rhs;
94template<u
int8_t e, u
int8_t s>
95class bit_overlay<e, s, 8>
97 static_assert(e >= s,
"Ending bit must be after starting bit");
98 static_assert(e < 8,
"Ending bit must be less than mapped width");
101 inline uint32_t asVal() {
return (*((uint8_t *)
this) >> s) & ((1UL << (e - s + 1)) - 1); }
102 inline operator uint8_t() {
return asVal(); }
103 inline uint8_t operator=(uint8_t rhs)
105 register uint8_t mask = ((1UL << (e - s + 1)) - 1);
106 *((uint8_t *)
this) &= ~(mask << s);
107 *((uint8_t *)
this) |= (rhs & mask) << s;
110 inline bool operator==(uint32_t rhs) {
return asVal() == rhs; }
111 inline bool operator>=(uint32_t rhs) {
return asVal() >= rhs; }
112 inline bool operator<(uint32_t rhs) {
return asVal() < rhs; }
113 inline uint8_t operator<<(uint32_t rhs) {
return asVal() << rhs; }
114 inline uint8_t operator*(uint32_t rhs) {
return asVal() * rhs; }
115} __attribute__((packed));
118template<u
int8_t e, u
int8_t s>
119class bit_overlay<e, s, 16>
121 static_assert(e >= s,
"Ending bit must be after starting bit");
122 static_assert(e < 16,
"Ending bit must be less than mapped width");
125 inline uint16_t asVal() {
return (*((uint16_t *)
this) >> s) & ((1UL << (e - s + 1)) - 1); }
126 inline operator uint16_t() {
return asVal(); }
127 inline uint16_t operator=(uint16_t rhs)
129 register uint16_t mask = ((1UL << (e - s + 1)) - 1);
130 *((uint16_t *)
this) &= ~(mask << s);
131 *((uint16_t *)
this) |= (rhs & mask) << s;
134 inline bool operator==(uint32_t rhs) {
return asVal() == rhs; }
135 inline bool operator>=(uint32_t rhs) {
return asVal() >= rhs; }
136 inline bool operator<(uint32_t rhs) {
return asVal() < rhs; }
137 inline uint16_t operator<<(uint32_t rhs) {
return asVal() << rhs; }
138 inline uint16_t operator*(uint32_t rhs) {
return asVal() * rhs; }
139} __attribute__((packed));
141#include <type_traits>
142static_assert(std::is_pod<bit_overlay<31, 0, 32>>::value,
"Data Structure requires constructible elements");