Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 1 | typedef unsigned int uint32_t; |
| 2 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 3 | enum MaskingOperator { |
| 4 | eMaskingOperatorDefault = 0, |
| 5 | eMaskingOperatorAnd = 1, |
| 6 | eMaskingOperatorOr = 2, |
| 7 | eMaskingOperatorXor = 3, |
| 8 | eMaskingOperatorNand = 4, |
| 9 | eMaskingOperatorNor = 5 |
Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 10 | }; |
| 11 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 12 | class MaskedData { |
Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 13 | private: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 14 | uint32_t value; |
| 15 | uint32_t mask; |
| 16 | MaskingOperator oper; |
| 17 | |
Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 18 | public: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 19 | MaskedData(uint32_t V = 0, uint32_t M = 0, |
| 20 | MaskingOperator P = eMaskingOperatorDefault) |
| 21 | : value(V), mask(M), oper(P) {} |
| 22 | |
| 23 | uint32_t apply() { |
| 24 | switch (oper) { |
| 25 | case eMaskingOperatorAnd: |
| 26 | return value & mask; |
| 27 | case eMaskingOperatorOr: |
| 28 | return value | mask; |
| 29 | case eMaskingOperatorXor: |
| 30 | return value ^ mask; |
| 31 | case eMaskingOperatorNand: |
| 32 | return ~(value & mask); |
| 33 | case eMaskingOperatorNor: |
| 34 | return ~(value | mask); |
| 35 | case eMaskingOperatorDefault: // fall through |
| 36 | default: |
| 37 | return value; |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | void setValue(uint32_t V) { value = V; } |
| 42 | |
| 43 | void setMask(uint32_t M) { mask = M; } |
| 44 | |
| 45 | void setOperator(MaskingOperator P) { oper = P; } |
Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 46 | }; |
| 47 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 48 | int main() { |
| 49 | MaskedData data_1(0xFF0F, 0xA01F, eMaskingOperatorAnd); |
| 50 | MaskedData data_2(data_1.apply(), 0x1AFC, eMaskingOperatorXor); |
| 51 | MaskedData data_3(data_2.apply(), 0xFFCF, eMaskingOperatorOr); |
| 52 | MaskedData data_4(data_3.apply(), 0xAABC, eMaskingOperatorAnd); |
| 53 | MaskedData data_5(data_4.apply(), 0xFFAC, eMaskingOperatorNor); |
| 54 | MaskedData data_6(data_5.apply(), 0x0000BEEF, eMaskingOperatorAnd); |
| 55 | return data_6.apply(); // <-- what comes out of here? |
Enrico Granata | ab8674f | 2012-03-17 02:02:03 +0000 | [diff] [blame] | 56 | } |