]> git.sesse.net Git - pistorm/blob - i2c_updater/pi-i2c/src/endian.hpp
Initial work on FPGA I2C programmer
[pistorm] / i2c_updater / pi-i2c / src / endian.hpp
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 #ifndef _ENDIAN_HPP_
6 #define _ENDIAN_HPP_
7
8 #include <cstdint>
9 // #include <bit> // we don't have GCC with C++20 on raspi :(
10
11 namespace nEndian {
12
13 template<typename t_tVal>
14 constexpr t_tVal swapBytes(t_tVal Val) {
15         t_tVal Out = 0;
16         for(size_t i = 0; i < sizeof(Val); ++i) {
17                 Out = (Out << 8) | (Val & 0xFF);
18                 Val >>= 8;
19         }
20         return Out;
21 }
22
23 template<typename t_tVal>
24 constexpr t_tVal littleToNative(const t_tVal &Val) {
25         // if(std::endian::native == std::endian::big) {
26         //      return swapBytes(Val);
27         // }
28         // else {
29                 return Val;
30         // }
31 }
32
33 template<typename t_tVal>
34 constexpr auto nativeToLittle = littleToNative<t_tVal>;
35
36 template<typename t_tVal>
37 constexpr t_tVal bigToNative(const t_tVal &Val) {
38         // if(std::endian::native == std::endian::big) {
39         //      return Val;
40         // }
41         // else {
42                 return swapBytes(Val);
43         // }
44 }
45
46 template<typename t_tVal>
47 constexpr auto nativeToBig = bigToNative<t_tVal>;
48
49
50 } // namespace nEndian
51
52 #endif // _ENDIAN_HPP_