|
@@ -645,64 +645,116 @@ protected:
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-#if COMMON_LITTLE_ENDIAN
|
|
|
|
|
-using u16_le = u16;
|
|
|
|
|
-using u32_le = u32;
|
|
|
|
|
-using u64_le = u64;
|
|
|
|
|
|
|
+struct SwapTag {}; // Use the different endianness from the system
|
|
|
|
|
+struct KeepTag {}; // Use the same endianness as the system
|
|
|
|
|
+
|
|
|
|
|
+template <typename T, typename Tag>
|
|
|
|
|
+struct AddEndian;
|
|
|
|
|
|
|
|
-using s16_le = s16;
|
|
|
|
|
-using s32_le = s32;
|
|
|
|
|
-using s64_le = s64;
|
|
|
|
|
|
|
+// KeepTag specializations
|
|
|
|
|
|
|
|
template <typename T>
|
|
template <typename T>
|
|
|
-using enum_le = std::enable_if_t<std::is_enum_v<T>, T>;
|
|
|
|
|
|
|
+struct AddEndian<T, KeepTag> {
|
|
|
|
|
+ using type = T;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// SwapTag specializations
|
|
|
|
|
|
|
|
-using float_le = float;
|
|
|
|
|
-using double_le = double;
|
|
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<u8, SwapTag> {
|
|
|
|
|
+ using type = u8;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-using u64_be = swap_struct_t<u64, swap_64_t<u64>>;
|
|
|
|
|
-using s64_be = swap_struct_t<s64, swap_64_t<s64>>;
|
|
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<u16, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<u16, swap_16_t<u16>>;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-using u32_be = swap_struct_t<u32, swap_32_t<u32>>;
|
|
|
|
|
-using s32_be = swap_struct_t<s32, swap_32_t<s32>>;
|
|
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<u32, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<u32, swap_32_t<u32>>;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-using u16_be = swap_struct_t<u16, swap_16_t<u16>>;
|
|
|
|
|
-using s16_be = swap_struct_t<s16, swap_16_t<s16>>;
|
|
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<u64, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<u64, swap_64_t<u64>>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<s8, SwapTag> {
|
|
|
|
|
+ using type = s8;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<s16, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<s16, swap_16_t<s16>>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<s32, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<s32, swap_32_t<s32>>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<s64, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<s64, swap_64_t<s64>>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<float, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<float, swap_float_t<float>>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+template <>
|
|
|
|
|
+struct AddEndian<double, SwapTag> {
|
|
|
|
|
+ using type = swap_struct_t<double, swap_double_t<double>>;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
template <typename T>
|
|
template <typename T>
|
|
|
-using enum_be = swap_enum_t<T>;
|
|
|
|
|
|
|
+struct AddEndian<T, SwapTag> {
|
|
|
|
|
+ static_assert(std::is_enum_v<T>);
|
|
|
|
|
+ using type = swap_enum_t<T>;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// Alias LETag/BETag as KeepTag/SwapTag depending on the system
|
|
|
|
|
+#if COMMON_LITTLE_ENDIAN
|
|
|
|
|
+
|
|
|
|
|
+using LETag = KeepTag;
|
|
|
|
|
+using BETag = SwapTag;
|
|
|
|
|
|
|
|
-using float_be = swap_struct_t<float, swap_float_t<float>>;
|
|
|
|
|
-using double_be = swap_struct_t<double, swap_double_t<double>>;
|
|
|
|
|
#else
|
|
#else
|
|
|
|
|
|
|
|
-using u64_le = swap_struct_t<u64, swap_64_t<u64>>;
|
|
|
|
|
-using s64_le = swap_struct_t<s64, swap_64_t<s64>>;
|
|
|
|
|
|
|
+using BETag = KeepTag;
|
|
|
|
|
+using LETag = SwapTag;
|
|
|
|
|
|
|
|
-using u32_le = swap_struct_t<u32, swap_32_t<u32>>;
|
|
|
|
|
-using s32_le = swap_struct_t<s32, swap_32_t<s32>>;
|
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
-using u16_le = swap_struct_t<u16, swap_16_t<u16>>;
|
|
|
|
|
-using s16_le = swap_struct_t<s16, swap_16_t<s16>>;
|
|
|
|
|
|
|
+// Aliases for LE types
|
|
|
|
|
+using u16_le = AddEndian<u16, LETag>::type;
|
|
|
|
|
+using u32_le = AddEndian<u32, LETag>::type;
|
|
|
|
|
+using u64_le = AddEndian<u64, LETag>::type;
|
|
|
|
|
+
|
|
|
|
|
+using s16_le = AddEndian<s16, LETag>::type;
|
|
|
|
|
+using s32_le = AddEndian<s32, LETag>::type;
|
|
|
|
|
+using s64_le = AddEndian<s64, LETag>::type;
|
|
|
|
|
|
|
|
template <typename T>
|
|
template <typename T>
|
|
|
-using enum_le = swap_enum_t<T>;
|
|
|
|
|
|
|
+using enum_le = std::enable_if_t<std::is_enum_v<T>, typename AddEndian<T, LETag>::type>;
|
|
|
|
|
|
|
|
-using float_le = swap_struct_t<float, swap_float_t<float>>;
|
|
|
|
|
-using double_le = swap_struct_t<double, swap_double_t<double>>;
|
|
|
|
|
|
|
+using float_le = AddEndian<float, LETag>::type;
|
|
|
|
|
+using double_le = AddEndian<double, LETag>::type;
|
|
|
|
|
|
|
|
-using u16_be = u16;
|
|
|
|
|
-using u32_be = u32;
|
|
|
|
|
-using u64_be = u64;
|
|
|
|
|
|
|
+// Aliases for BE types
|
|
|
|
|
+using u16_be = AddEndian<u16, BETag>::type;
|
|
|
|
|
+using u32_be = AddEndian<u32, BETag>::type;
|
|
|
|
|
+using u64_be = AddEndian<u64, BETag>::type;
|
|
|
|
|
|
|
|
-using s16_be = s16;
|
|
|
|
|
-using s32_be = s32;
|
|
|
|
|
-using s64_be = s64;
|
|
|
|
|
|
|
+using s16_be = AddEndian<s16, BETag>::type;
|
|
|
|
|
+using s32_be = AddEndian<s32, BETag>::type;
|
|
|
|
|
+using s64_be = AddEndian<s64, BETag>::type;
|
|
|
|
|
|
|
|
template <typename T>
|
|
template <typename T>
|
|
|
-using enum_be = std::enable_if_t<std::is_enum_v<T>, T>;
|
|
|
|
|
-
|
|
|
|
|
-using float_be = float;
|
|
|
|
|
-using double_be = double;
|
|
|
|
|
|
|
+using enum_be = std::enable_if_t<std::is_enum_v<T>, typename AddEndian<T, BETag>::type>;
|
|
|
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+using float_be = AddEndian<float, BETag>::type;
|
|
|
|
|
+using double_be = AddEndian<double, BETag>::type;
|