26 #define FRAMEWORK_BIG_ENDIAN 1
31 #define FRAMEWORK_LITTLE_ENDIAN 2
36 #define FRAMEWORK_PDP_ENDIAN 3
38 #ifndef FRAMEWORK_HOST_ENDIANNESS
42 #if __BYTE_ORDER == __LITTLE_ENDIAN
43 #define FRAMEWORK_HOST_ENDIANNESS FRAMEWORK_LITTLE_ENDIAN
44 #elif __BYTE_ORDER == __BIG_ENDIAN
45 #define FRAMEWORK_HOST_ENDIANNESS FRAMEWORK_BIG_ENDIAN
46 #elif __BYTE_ORDER == __PDP_ENDIAN
47 #define FRAMEWORK_HOST_ENDIANNESS FRAMEWORK_PDP_ENDIAN
49 #error "Host endianness not supported"
52 #error "Platform not supported";
56 #ifndef FRAMEWORK_HOST_FLOAT_ENDIANNESS
60 #if __FLOAT_WORD_ORDER == __LITTLE_ENDIAN
61 #define FRAMEWORK_HOST_FLOAT_ENDIANNESS FRAMEWORK_LITTLE_ENDIAN
62 #elif __FLOAT_WORD_ORDER == __BIG_ENDIAN
63 #define FRAMEWORK_HOST_FLOAT_ENDIANNESS FRAMEWORK_BIG_ENDIAN
64 #elif __FLOAT_WORD_ORDER == __PDP_ENDIAN
65 #define FRAMEWORK_HOST_FLOAT_ENDIANNESS FRAMEWORK_PDP_ENDIAN
67 #error "Host endianness not supported"
70 #error "Platform not supported";
75 #if FRAMEWORK_HOST_ENDIANNESS == FRAMEWORK_BIG_ENDIAN
76 #elif FRAMEWORK_HOST_ENDIANNESS == FRAMEWORK_LITTLE_ENDIAN
77 #elif FRAMEWORK_HOST_ENDIANNESS == FRAMEWORK_PDP_ENDIAN
79 #error "Invalid FRAMEWORK_HOST_ENDIANNESS definition"
83 #if FRAMEWORK_HOST_FLOAT_ENDIANNESS == FRAMEWORK_BIG_ENDIAN
84 #elif FRAMEWORK_HOST_FLOAT_ENDIANNESS == FRAMEWORK_LITTLE_ENDIAN
85 #elif FRAMEWORK_HOST_FLOAT_ENDIANNESS == FRAMEWORK_PDP_ENDIAN
87 #error "Invalid FRAMEWORK_HOST_FLOAT_ENDIANNESS definition"
108 template <
typename T,
typename Enabler =
void>
109 struct little_to_host_impl;
111 template <
typename T,
typename Enabler =
void>
112 struct host_to_little_impl;
114 template <
typename T,
typename Enabler =
void>
115 struct big_to_host_impl;
117 template <
typename T,
typename Enabler =
void>
118 struct host_to_big_impl;
120 template <
typename T,
typename Enabler =
void>
121 struct pdp_to_host_impl;
123 template <
typename T,
typename Enabler =
void>
124 struct host_to_pdp_impl;
126 template <
typename T>
127 using reduce =
typename std::remove_cv <typename std::remove_reference <T>::type>::type;
130 template <
typename T>
131 detail::reduce <T> little_to_host (T&& x)
133 return detail::little_to_host_impl <detail::reduce <T>>::run(std::forward <T> (x));
136 template <
typename T>
137 detail::reduce <T> host_to_little (T&& x)
139 return detail::host_to_little_impl <detail::reduce <T>>::run(std::forward <T> (x));
142 template <
typename T>
143 detail::reduce <T> big_to_host (T&& x)
145 return detail::big_to_host_impl <detail::reduce <T>>::run(std::forward <T> (x));
148 template <
typename T>
149 detail::reduce <T> host_to_big (T&& x)
151 return detail::host_to_big_impl <detail::reduce <T>>::run(std::forward <T> (x));
154 template <
typename T>
155 detail::reduce <T> pdp_to_host (T&& x)
157 return detail::pdp_to_host_impl <detail::reduce <T>>::run(std::forward <T> (x));
160 template <
typename T>
161 detail::reduce <T> host_to_pdp (T&& x)
163 return detail::host_to_pdp_impl <detail::reduce <T>>::run(std::forward <T> (x));
167 #include <framework/common/endian.inl>
172 #error "Documentation only"
182 #define FRAMEWORK_HOST_ENDIANNESS
192 #define FRAMEWORK_HOST_FLOAT_ENDIANNESS