diff options
Diffstat (limited to 'asl/base')
-rw-r--r-- | asl/base/meta.hpp | 26 | ||||
-rw-r--r-- | asl/base/meta_tests.cpp | 36 |
2 files changed, 58 insertions, 4 deletions
diff --git a/asl/base/meta.hpp b/asl/base/meta.hpp index b17d761..9f67e13 100644 --- a/asl/base/meta.hpp +++ b/asl/base/meta.hpp @@ -317,15 +317,33 @@ template<typename T> concept is_integer = is_signed_integer<T> || is_unsigned_in template<is_integer T> using as_unsigned_integer = _integer_traits<T>::as_unsigned; template<is_integer T> using as_signed_integer = _integer_traits<T>::as_signed; +template<int N> +struct smallest_unsigned_integer_type_for_width_helper { using type = void; }; + +template<int N> requires (N >= 1 and N <= 8) +struct smallest_unsigned_integer_type_for_width_helper<N> { using type = uint8_t; }; + +template<int N> requires (N >= 9 and N <= 16) +struct smallest_unsigned_integer_type_for_width_helper<N> { using type = uint16_t; }; + +template<int N> requires (N >= 17 and N <= 32) +struct smallest_unsigned_integer_type_for_width_helper<N> { using type = uint32_t; }; + +template<int N> requires (N >= 33 and N <= 64) +struct smallest_unsigned_integer_type_for_width_helper<N> { using type = uint64_t; }; + +template<int N> using smallest_unsigned_integer_type_for_width + = smallest_unsigned_integer_type_for_width_helper<N>::type; + template<typename T> concept is_enum = __is_enum(T); template<is_enum T> using underlying_t = __underlying_type(T); -template<typename T> struct is_uniquely_represented : false_type {}; -template<is_integer T> struct is_uniquely_represented<T> : true_type {}; -template<is_enum T> struct is_uniquely_represented<T> : true_type {}; +template<typename T> struct is_uniquely_represented : false_type {}; +template<is_integer T> struct is_uniquely_represented<T> : true_type {}; +template<is_enum T> struct is_uniquely_represented<T> : true_type {}; template<> struct is_uniquely_represented<uint128_t> : true_type {}; -template<> struct is_uniquely_represented<byte> : true_type {}; +template<> struct is_uniquely_represented<byte> : true_type {}; template<typename T> concept uniquely_represented = is_uniquely_represented<un_cv_t<T>>::value; diff --git a/asl/base/meta_tests.cpp b/asl/base/meta_tests.cpp index 36b0429..fbbec15 100644 --- a/asl/base/meta_tests.cpp +++ b/asl/base/meta_tests.cpp @@ -389,3 +389,39 @@ enum EnumI64 : int64_t {}; static_assert(asl::same_as<asl::underlying_t<EnumU8>, uint8_t>); static_assert(asl::same_as<asl::underlying_t<EnumI64>, int64_t>); +static_assert(!asl::is_integer<EnumU8>); +static_assert(!asl::is_integer<EnumI64>); + +static_assert(asl::same_as<asl::as_unsigned_integer<uint8_t>, uint8_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<uint16_t>, uint16_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<uint32_t>, uint32_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<uint64_t>, uint64_t>); + +static_assert(asl::same_as<asl::as_unsigned_integer<int8_t>, uint8_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<int16_t>, uint16_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<int32_t>, uint32_t>); +static_assert(asl::same_as<asl::as_unsigned_integer<int64_t>, uint64_t>); + +static_assert(asl::same_as<asl::as_signed_integer<uint8_t>, int8_t>); +static_assert(asl::same_as<asl::as_signed_integer<uint16_t>, int16_t>); +static_assert(asl::same_as<asl::as_signed_integer<uint32_t>, int32_t>); +static_assert(asl::same_as<asl::as_signed_integer<uint64_t>, int64_t>); + +static_assert(asl::same_as<asl::as_signed_integer<int8_t>, int8_t>); +static_assert(asl::same_as<asl::as_signed_integer<int16_t>, int16_t>); +static_assert(asl::same_as<asl::as_signed_integer<int32_t>, int32_t>); +static_assert(asl::same_as<asl::as_signed_integer<int64_t>, int64_t>); + +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<1>, uint8_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<2>, uint8_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<4>, uint8_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<8>, uint8_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<12>, uint16_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<16>, uint16_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<20>, uint32_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<30>, uint32_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<31>, uint32_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<32>, uint32_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<50>, uint64_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<63>, uint64_t>); +static_assert(asl::same_as<asl::smallest_unsigned_integer_type_for_width<64>, uint64_t>); |