xref: /openbsd-src/gnu/llvm/lldb/examples/synthetic/bitfield/program.cpp (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
1*061da546Spatrick typedef unsigned int uint32_t;
2*061da546Spatrick 
3*061da546Spatrick enum MaskingOperator {
4*061da546Spatrick   eMaskingOperatorDefault = 0,
5*061da546Spatrick   eMaskingOperatorAnd = 1,
6*061da546Spatrick   eMaskingOperatorOr = 2,
7*061da546Spatrick   eMaskingOperatorXor = 3,
8*061da546Spatrick   eMaskingOperatorNand = 4,
9*061da546Spatrick   eMaskingOperatorNor = 5
10*061da546Spatrick };
11*061da546Spatrick 
12*061da546Spatrick class MaskedData {
13*061da546Spatrick private:
14*061da546Spatrick   uint32_t value;
15*061da546Spatrick   uint32_t mask;
16*061da546Spatrick   MaskingOperator oper;
17*061da546Spatrick 
18*061da546Spatrick public:
MaskedData(uint32_t V=0,uint32_t M=0,MaskingOperator P=eMaskingOperatorDefault)19*061da546Spatrick   MaskedData(uint32_t V = 0, uint32_t M = 0,
20*061da546Spatrick              MaskingOperator P = eMaskingOperatorDefault)
21*061da546Spatrick       : value(V), mask(M), oper(P) {}
22*061da546Spatrick 
apply()23*061da546Spatrick   uint32_t apply() {
24*061da546Spatrick     switch (oper) {
25*061da546Spatrick     case eMaskingOperatorAnd:
26*061da546Spatrick       return value & mask;
27*061da546Spatrick     case eMaskingOperatorOr:
28*061da546Spatrick       return value | mask;
29*061da546Spatrick     case eMaskingOperatorXor:
30*061da546Spatrick       return value ^ mask;
31*061da546Spatrick     case eMaskingOperatorNand:
32*061da546Spatrick       return ~(value & mask);
33*061da546Spatrick     case eMaskingOperatorNor:
34*061da546Spatrick       return ~(value | mask);
35*061da546Spatrick     case eMaskingOperatorDefault: // fall through
36*061da546Spatrick     default:
37*061da546Spatrick       return value;
38*061da546Spatrick     }
39*061da546Spatrick   }
40*061da546Spatrick 
setValue(uint32_t V)41*061da546Spatrick   void setValue(uint32_t V) { value = V; }
42*061da546Spatrick 
setMask(uint32_t M)43*061da546Spatrick   void setMask(uint32_t M) { mask = M; }
44*061da546Spatrick 
setOperator(MaskingOperator P)45*061da546Spatrick   void setOperator(MaskingOperator P) { oper = P; }
46*061da546Spatrick };
47*061da546Spatrick 
main()48*061da546Spatrick int main() {
49*061da546Spatrick   MaskedData data_1(0xFF0F, 0xA01F, eMaskingOperatorAnd);
50*061da546Spatrick   MaskedData data_2(data_1.apply(), 0x1AFC, eMaskingOperatorXor);
51*061da546Spatrick   MaskedData data_3(data_2.apply(), 0xFFCF, eMaskingOperatorOr);
52*061da546Spatrick   MaskedData data_4(data_3.apply(), 0xAABC, eMaskingOperatorAnd);
53*061da546Spatrick   MaskedData data_5(data_4.apply(), 0xFFAC, eMaskingOperatorNor);
54*061da546Spatrick   MaskedData data_6(data_5.apply(), 0x0000BEEF, eMaskingOperatorAnd);
55*061da546Spatrick   return data_6.apply(); // <-- what comes out of here?
56*061da546Spatrick }
57