1#ifndef BYTE_ORDER_HPP_LPUJ094I
2#define BYTE_ORDER_HPP_LPUJ094I
8#include <boost/endian/conversion.hpp>
16 return boost::endian::native_to_big(host_value);
20T ntoh(T network_value)
22 return boost::endian::big_to_native(network_value);
35#if BYTE_ORDER == LITTLE_ENDIAN
36 static constexpr ByteOrder host_byte_order = ByteOrder::LittleEndian;
37#elif BYTE_ORDER == BIG_ENDIAN
38 static constexpr ByteOrder host_byte_order = ByteOrder::BigEndian;
40# error "Unknown byte order"
45constexpr ByteOrder getHostByteOrder() {
return detail::host_byte_order; }
47template<
typename T, ByteOrder ORDER = getHostByteOrder()>
57template<ByteOrder ORDER,
typename T>
58EndianType<T, ORDER> endian_cast(T value)
60 return static_cast< EndianType<T, ORDER>
>(value);
69EndianType<T, getHostByteOrder()> host_cast(T value)
71 return endian_cast<getHostByteOrder()>(value);
80EndianType<T, ByteOrder::BigEndian> network_cast(T value)
82 return endian_cast<ByteOrder::BigEndian>(value);
89template<
typename T, ByteOrder FROM, ByteOrder TO>
92 T operator()(
const T&)
const;
95template<
typename T, ByteOrder ORDER>
98 T operator()(
const T& t)
const {
return t; }
104 T operator()(
const T& t)
const {
return boost::endian::endian_reverse(t); }
110 T operator()(
const T& t)
const {
return boost::endian::endian_reverse(t); }
113template<
typename T, ByteOrder FROM, ByteOrder TO>
114T convert_endian(
const T& t)
123template<
typename T, ByteOrder ORDER>
127 static_assert(std::is_pod<T>::value ==
true,
"EndianType is only availabe for POD types");
128 typedef T value_type;
133 explicit EndianType(T value) { m_value = value; }
138 template<ByteOrder OTHER_ORDER>
140 m_value(detail::convert_endian<T, OTHER_ORDER, ORDER>(other.m_value))
144 template<ByteOrder OTHER_ORDER>
147 m_value = detail::convert_endian<T, OTHER_ORDER, ORDER>(other.m_value);
151 bool operator==(
const EndianType& other)
const
153 return m_value == other.m_value;
156 bool operator!=(
const EndianType& other)
const
158 return !(*
this == other);
163 return m_value < other.m_value;
166 value_type net()
const
168 return detail::convert_endian<T, ORDER, ByteOrder::BigEndian>(m_value);
171 value_type host()
const
173 return detail::convert_endian<T, ORDER, getHostByteOrder()>(m_value);
176 value_type get()
const
182 friend class EndianType<T, ByteOrder::BigEndian>;
183 friend class
EndianType<T, ByteOrder::LittleEndian>;
195template<typename T, ByteOrder ORDER>
196std::ostream& operator<<(std::ostream& os, const EndianType<T, ORDER>& t)
202typedef EndianType<uint8_t, ByteOrder::BigEndian> uint8be_t;
203typedef EndianType<uint16_t, ByteOrder::BigEndian> uint16be_t;
204typedef EndianType<uint32_t, ByteOrder::BigEndian> uint32be_t;
205typedef EndianType<uint64_t, ByteOrder::BigEndian> uint64be_t;
207typedef EndianType<int8_t, ByteOrder::BigEndian> int8be_t;
208typedef EndianType<int16_t, ByteOrder::BigEndian> int16be_t;
209typedef EndianType<int32_t, ByteOrder::BigEndian> int32be_t;
210typedef EndianType<int64_t, ByteOrder::BigEndian> int64be_t;
217template<typename T, vanetza::ByteOrder ORDER>
218struct hash<vanetza::EndianType<T, ORDER>>
220 size_t operator()(const vanetza::EndianType<T, ORDER>& t) const
222 return hash<T>()(t.get());