xref: /openbmc/phosphor-net-ipmid/endian.hpp (revision 9e801a2b)
1 #pragma once
2 
3 #include <endian.h>
4 #include <stdint.h>
5 
6 namespace endian
7 {
8 namespace details
9 {
10 template <typename T>
11 struct convert
12 {
13     static T to_ipmi(T) = delete;
14     static T from_ipmi(T) = delete;
15     static T to_network(T) = delete;
16     static T from_network(T) = delete;
17 };
18 
19 template <>
20 struct convert<uint16_t>
21 {
22     static uint16_t to_ipmi(uint16_t i)
23     {
24         return htole16(i);
25     };
26     static uint16_t from_ipmi(uint16_t i)
27     {
28         return le16toh(i);
29     };
30     static uint16_t to_network(uint16_t i)
31     {
32         return htobe16(i);
33     };
34     static uint16_t from_network(uint16_t i)
35     {
36         return be16toh(i);
37     };
38 };
39 
40 template <>
41 struct convert<uint32_t>
42 {
43     static uint32_t to_ipmi(uint32_t i)
44     {
45         return htole32(i);
46     };
47     static uint32_t from_ipmi(uint32_t i)
48     {
49         return le32toh(i);
50     };
51     static uint32_t to_network(uint32_t i)
52     {
53         return htobe32(i);
54     };
55     static uint32_t from_network(uint32_t i)
56     {
57         return be32toh(i);
58     };
59 };
60 } // namespace details
61 
62 template <typename T>
63 T to_ipmi(T i)
64 {
65     return details::convert<T>::to_ipmi(i);
66 }
67 
68 template <typename T>
69 T from_ipmi(T i)
70 {
71     return details::convert<T>::from_ipmi(i);
72 }
73 
74 template <typename T>
75 T to_network(T i)
76 {
77     return details::convert<T>::to_network(i);
78 }
79 template <typename T>
80 T from_network(T i)
81 {
82     return details::convert<T>::from_network(i);
83 }
84 } // namespace endian
85