Add smallest_unsigned_integer_type_for_width

This commit is contained in:
2025-05-28 00:47:52 +02:00
parent 19e2164441
commit afb237c513
2 changed files with 58 additions and 4 deletions

View File

@ -317,6 +317,24 @@ 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);

View File

@ -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>);