summaryrefslogtreecommitdiff
path: root/examples/synthetic/bitfield/program.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/synthetic/bitfield/program.cpp')
-rw-r--r--examples/synthetic/bitfield/program.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/examples/synthetic/bitfield/program.cpp b/examples/synthetic/bitfield/program.cpp
new file mode 100644
index 0000000000000..5276824a2fb42
--- /dev/null
+++ b/examples/synthetic/bitfield/program.cpp
@@ -0,0 +1,74 @@
+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?
+} \ No newline at end of file