#pragma once #include "util/types.hpp" #include "util/endian.hpp" namespace rx { union v128; } using rx::v128; // Type converter: converts native endianness arithmetic/enum types to appropriate se_t<> type template struct to_se { template struct to_se_ { using type = T2; }; template requires std::is_arithmetic_v || std::is_enum_v struct to_se_ { using type = std::conditional_t<(sizeof(T2) > 1), se_t, T2>; }; // Convert arithmetic and enum types using type = typename to_se_::type; }; template struct to_se { using type = se_t; }; template struct to_se { using type = se_t; }; template struct to_se { using type = se_t; }; template requires(!std::is_array_v) struct to_se { // Move const qualifier using type = const typename to_se::type; }; template requires(!std::is_array_v && !std::is_const_v) struct to_se { // Move volatile qualifier using type = volatile typename to_se::type; }; template struct to_se { // Move array qualifier using type = typename to_se::type[]; }; template struct to_se { // Move array qualifier using type = typename to_se::type[N]; }; // BE/LE aliases for to_se<> template using to_be_t = typename to_se::type; template using to_le_t = typename to_se::type;