1 #include <util/bin_stream.hpp>
2
3 #include "gtest/gtest.h"
4
5 enum RegisterId_t : uint32_t; // Defined in hei_types.hpp
6
7 namespace util
8 {
9
10 /** @brief Extracts big-endian data to host RegisterId_t. */
11 template <>
operator >>(RegisterId_t & r)12 inline BinFileReader& BinFileReader::operator>>(RegisterId_t& r)
13 {
14 // A register ID is only 3 bytes, but there isn't a 3-byte integer type.
15 // So extract 3 bytes to a uint32_t and drop the unused byte.
16 uint32_t tmp = 0;
17 read(&tmp, 3);
18 r = static_cast<RegisterId_t>(be32toh(tmp) >> 8);
19 return *this;
20 }
21
22 /** @brief Inserts host RegisterId_t to big-endian data. */
23 template <>
operator <<(RegisterId_t r)24 inline BinFileWriter& BinFileWriter::operator<<(RegisterId_t r)
25 {
26 // A register ID is only 3 bytes, but there isn't a 3-byte integer type.
27 // So extract 3 bytes to a uint32_t and drop the unused byte.
28 uint32_t tmp = htobe32(static_cast<uint32_t>(r) << 8);
29 write(&tmp, 3);
30 return *this;
31 }
32
33 } // namespace util
34
TEST(BinStream,TestSet1)35 TEST(BinStream, TestSet1)
36 {
37 uint8_t w1 = 0x11;
38 uint16_t w2 = 0x1122;
39 uint32_t w3 = 0x11223344;
40 uint64_t w4 = 0x1122334455667788;
41 RegisterId_t w5 = static_cast<RegisterId_t>(0x123456);
42
43 {
44 // need scope so the writer is closed before the reader opens
45 util::BinFileWriter w{"bin_stream_test.bin"};
46 ASSERT_TRUE(w.good());
47
48 w << w1 << w2 << w3 << w4 << w5;
49 ASSERT_TRUE(w.good());
50 }
51
52 uint8_t r1;
53 uint16_t r2;
54 uint32_t r3;
55 uint64_t r4;
56 RegisterId_t r5;
57
58 {
59 util::BinFileReader r{"bin_stream_test.bin"};
60 ASSERT_TRUE(r.good());
61
62 r >> r1 >> r2 >> r3 >> r4 >> r5;
63 ASSERT_TRUE(r.good());
64 }
65
66 ASSERT_EQ(w1, r1);
67 ASSERT_EQ(w2, r2);
68 ASSERT_EQ(w3, r3);
69 ASSERT_EQ(w4, r4);
70 ASSERT_EQ(w5, r5);
71 }
72