diff options
Diffstat (limited to 'src/base/bituniontest.cc')
-rw-r--r-- | src/base/bituniontest.cc | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/base/bituniontest.cc b/src/base/bituniontest.cc index 1f24e7e66..ed7b77b66 100644 --- a/src/base/bituniontest.cc +++ b/src/base/bituniontest.cc @@ -66,6 +66,44 @@ EndBitUnion(EmptySixteen) BitUnion8(EmptyEight) EndBitUnion(EmptyEight) +class SplitField +{ + protected: + BitUnion64(In) + Bitfield<15, 12> high; + Bitfield<7, 4> low; + EndBitUnion(In) + + BitUnion64(Out) + Bitfield<7, 4> high; + Bitfield<3, 0> low; + EndBitUnion(Out) + public: + uint64_t + getter(const uint64_t &storage) const + { + Out out = 0; + In in = storage; + out.high = in.high; + out.low = in.low; + return out; + } + + void + setter(uint64_t &storage, uint64_t val) + { + Out out = val; + In in = 0; + in.high = out.high; + in.low = out.low; + storage = in; + } +}; + +BitUnion64(Split) + BitfieldType<SplitField> split; +EndBitUnion(Split) + struct ContainingStruct { BitUnion64(Contained) @@ -99,8 +137,9 @@ EmptyEight emptyEight(0); class BitUnionData : public testing::Test { protected: SixtyFour sixtyFour; + Split split; - void SetUp() override { sixtyFour = 0; } + void SetUp() override { sixtyFour = 0; split = 0; } }; TEST_F(BitUnionData, NormalBitfield) @@ -192,3 +231,11 @@ TEST_F(BitUnionData, Operators) sixtyFour = otherSixtyFour; EXPECT_TRUE(sixtyFour == otherSixtyFour); } + +TEST_F(BitUnionData, Custom) +{ + EXPECT_EQ(split, 0); + split.split = 0xfff; + EXPECT_EQ(split, 0xf0f0); + EXPECT_EQ((uint64_t)split.split, 0xff); +} |