ledger-core
endian.h
1 /*
2  *
3  * endian
4  * ledger-core
5  *
6  * Created by Pierre Pollastri on 15/09/2016.
7  *
8  * The MIT License (MIT)
9  *
10  * Copyright (c) 2016 Ledger
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a copy
13  * of this software and associated documentation files (the "Software"), to deal
14  * in the Software without restriction, including without limitation the rights
15  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16  * copies of the Software, and to permit persons to whom the Software is
17  * furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included in all
20  * copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28  * SOFTWARE.
29  *
30  */
31 
32 #undef BIG_ENDIAN
33 #undef LITTLE_ENDIAN
34 
35 #ifndef LEDGER_CORE_ENDIAN_H
36 #define LEDGER_CORE_ENDIAN_H
37 
38 #include <cstddef>
39 #include <cstdlib>
40 #include <cstdint>
41 
45 namespace ledger {
46 
47  namespace core {
48 
53  namespace endianness {
54 
55  enum struct Endianness {
56  BIG = 1,
57  LITTLE
58  };
59 
65  Endianness getSystemEndianness();
66 
71  bool isSystemBigEndian();
72 
77  bool isSystemLittleEndian();
78 
85  void *swapToBigEndian(void *ptr, size_t size);
86 
93  void *swapToLittleEndian(void *ptr, size_t size);
94 
103  void *swapToEndianness(void *ptr, size_t size, Endianness current, Endianness final);
104 
105  const void* int_to_array(int i, Endianness endianness);
106  const void* unsigned_long_long_to_array(unsigned long long i, Endianness endianness);
107 
108  template <typename T>
109  void* scalar_type_to_array(T i, Endianness endianness) {
110  uint8_t *data = (uint8_t *) std::malloc(sizeof(i));
111  auto ptr = (const uint8_t *)(&i);
112  for (auto index = 0; index < sizeof(i); index++) {
113  data[index] = ptr[index];
114  }
115  swapToEndianness(data, sizeof(i), getSystemEndianness(), endianness);
116  return (void *)data;
117  }
118  }
119  }
120 }
121 
122 #endif //LEDGER_CORE_ENDIAN_H
bool isSystemBigEndian()
Definition: endian.cpp:45
Endianness getSystemEndianness()
Definition: endian.cpp:39
bool isSystemLittleEndian()
Definition: endian.cpp:49
void * swapToEndianness(void *ptr, size_t size, Endianness current, Endianness final)
Definition: endian.cpp:76
void * swapToLittleEndian(void *ptr, size_t size)
Definition: endian.cpp:69
Definition: Account.cpp:8
void * swapToBigEndian(void *ptr, size_t size)
Definition: endian.cpp:62