1 typedef unsigned int uint32_t; 2 3 enum MaskingOperator 4 { 5 eMaskingOperatorDefault = 0, 6 eMaskingOperatorAnd = 1, 7 eMaskingOperatorOr = 2, 8 eMaskingOperatorXor = 3, 9 eMaskingOperatorNand = 4, 10 eMaskingOperatorNor = 5 11 }; 12 13 class MaskedData 14 { 15 private: 16 uint32_t value; 17 uint32_t mask; 18 MaskingOperator oper; 19 public: 20 MaskedData( uint32_t V = 0, 21 uint32_t M = 0, 22 MaskingOperator P = eMaskingOperatorDefault) : 23 value(V), 24 mask(M), 25 oper(P) 26 { 27 } 28 29 uint32_t apply() 30 { 31 switch(oper) 32 { 33 case eMaskingOperatorAnd: 34 return value & mask; 35 case eMaskingOperatorOr: 36 return value | mask; 37 case eMaskingOperatorXor: 38 return value ^ mask; 39 case eMaskingOperatorNand: 40 return ~(value & mask); 41 case eMaskingOperatorNor: 42 return ~(value | mask); 43 case eMaskingOperatorDefault: // fall through 44 default: 45 return value; 46 } 47 } 48 49 void setValue(uint32_t V) 50 { 51 value = V; 52 } 53 54 void setMask (uint32_t M) 55 { 56 mask = M; 57 } 58 59 void setOperator(MaskingOperator P) 60 { 61 oper = P; 62 } 63 }; 64 65 int main() 66 { 67 MaskedData data_1(0xFF0F,0xA01F,eMaskingOperatorAnd); 68 MaskedData data_2(data_1.apply(),0x1AFC,eMaskingOperatorXor); 69 MaskedData data_3(data_2.apply(),0xFFCF,eMaskingOperatorOr); 70 MaskedData data_4(data_3.apply(),0xAABC,eMaskingOperatorAnd); 71 MaskedData data_5(data_4.apply(),0xFFAC,eMaskingOperatorNor); 72 MaskedData data_6(data_5.apply(),0x0000BEEF,eMaskingOperatorAnd); 73 return data_6.apply(); // <-- what comes out of here? 74 }