| typedef unsigned int uint32_t; |
| |
| enum MaskingOperator |
| { |
| eMaskingOperatorDefault = 0, |
| eMaskingOperatorAnd = 1, |
| eMaskingOperatorOr = 2, |
| eMaskingOperatorXor = 3, |
| eMaskingOperatorNand = 4, |
| eMaskingOperatorNor = 5 |
| }; |
| |
| class MaskedData |
| { |
| private: |
| uint32_t value; |
| uint32_t mask; |
| MaskingOperator oper; |
| public: |
| MaskedData( uint32_t V = 0, |
| uint32_t M = 0, |
| MaskingOperator P = eMaskingOperatorDefault) : |
| value(V), |
| mask(M), |
| oper(P) |
| { |
| } |
| |
| uint32_t apply() |
| { |
| switch(oper) |
| { |
| case eMaskingOperatorAnd: |
| return value & mask; |
| case eMaskingOperatorOr: |
| return value | mask; |
| case eMaskingOperatorXor: |
| return value ^ mask; |
| case eMaskingOperatorNand: |
| return ~(value & mask); |
| case eMaskingOperatorNor: |
| return ~(value | mask); |
| case eMaskingOperatorDefault: // fall through |
| default: |
| return value; |
| } |
| } |
| |
| void setValue(uint32_t V) |
| { |
| value = V; |
| } |
| |
| void setMask (uint32_t M) |
| { |
| mask = M; |
| } |
| |
| void setOperator(MaskingOperator P) |
| { |
| oper = P; |
| } |
| }; |
| |
| int main() |
| { |
| MaskedData data_1(0xFF0F,0xA01F,eMaskingOperatorAnd); |
| MaskedData data_2(data_1.apply(),0x1AFC,eMaskingOperatorXor); |
| MaskedData data_3(data_2.apply(),0xFFCF,eMaskingOperatorOr); |
| MaskedData data_4(data_3.apply(),0xAABC,eMaskingOperatorAnd); |
| MaskedData data_5(data_4.apply(),0xFFAC,eMaskingOperatorNor); |
| MaskedData data_6(data_5.apply(),0x0000BEEF,eMaskingOperatorAnd); |
| return data_6.apply(); // <-- what comes out of here? |
| } |