1 #pragma once
2 
3 /**
4  * @brief Specially utilities that are specific to the analyzer (typically
5  *        stuff that involves libhei).
6  */
7 
8 #include <hei_main.hpp>
9 #include <util/bin_stream.hpp>
10 
11 namespace util
12 {
13 
14 /** @brief Extracts big-endian data to host RegisterId_t. */
15 template <>
operator >>(libhei::RegisterId_t & r)16 inline BinFileReader& BinFileReader::operator>>(libhei::RegisterId_t& r)
17 {
18     // A register ID is only 3 bytes, but there isn't a 3-byte integer type.
19     // So extract 3 bytes to a uint32_t and drop the unused byte.
20     uint32_t tmp = 0;
21     read(&tmp, 3);
22     r = static_cast<libhei::RegisterId_t>(be32toh(tmp) >> 8);
23     return *this;
24 }
25 
26 /** @brief Inserts host RegisterId_t to big-endian data. */
27 template <>
operator <<(libhei::RegisterId_t r)28 inline BinFileWriter& BinFileWriter::operator<<(libhei::RegisterId_t r)
29 {
30     // A register ID is only 3 bytes, but there isn't a 3-byte integer type.
31     // So extract 3 bytes to a uint32_t and drop the unused byte.
32     uint32_t tmp = htobe32(static_cast<uint32_t>(r) << 8);
33     write(&tmp, 3);
34     return *this;
35 }
36 
37 } // namespace util
38