// // Sizes.hpp // Clock Signal // // Created by Thomas Harte on 26/01/2021. // Copyright © 2021 Thomas Harte. All rights reserved. // #pragma once #include #include #include template struct uint_t_impl; template <> struct uint_t_impl<8> { using type = uint8_t; }; template <> struct uint_t_impl<16> { using type = uint16_t; }; template <> struct uint_t_impl<32> { using type = uint32_t; }; template <> struct uint_t_impl<64> { using type = uint64_t; }; /// Unsigned integer types templated on size; `uint_t<8> = uint8_t`; `uint_t<16> = uint16_t`, etc. template using uint_t = typename uint_t_impl::type; /*! Maps to the smallest integral type that can contain `max_value`, from the following options: * uint8_t; * uint16_t; * uint32_t; or * uint64_t. */ template struct MinIntForValue { using type = std::conditional_t< max_value <= std::numeric_limits::max(), uint8_t, std::conditional_t< max_value <= std::numeric_limits::max(), uint16_t, std::conditional_t< max_value <= std::numeric_limits::max(), uint32_t, uint64_t > > >; }; template using min_int_for_value_t = typename MinIntForValue::type; /*! Maps to the smallest integral type that can hold at least `max_bits` bits, from the following options: * uint8_t; * uint16_t; * uint32_t; or * uint64_t. */ template struct MinIntForBits { static_assert(min_bits <= 64, "Only integers up to 64 bits are supported"); using type = std::conditional_t< min_bits <= 8, uint8_t, std::conditional_t< min_bits <= 16, uint16_t, std::conditional_t< min_bits <= 32, uint32_t, uint64_t > > >; }; template using min_int_for_bits_t = typename MinIntForBits::type; static_assert(std::is_same_v, uint8_t>); static_assert(std::is_same_v, uint8_t>); static_assert(std::is_same_v, uint16_t>); static_assert(std::is_same_v, uint16_t>); static_assert(std::is_same_v, uint32_t>);