AsmGrader 0.0.0
Loading...
Searching...
No Matches
integer.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <boost/mp11/algorithm.hpp>
6#include <boost/mp11/detail/mp_list.hpp>
7#include <boost/mp11/integral.hpp>
8
9#include <bit>
10#include <cmath>
11#include <concepts>
12#include <cstddef>
13#include <cstdint>
14#include <limits>
15#include <type_traits>
16
17namespace asmgrader {
18
19namespace detail {
20namespace mp = boost::mp11;
21
22using sized_uint_map = mp::mp_list<u8, std::uint16_t, std::uint32_t, std::uint64_t>;
23using sized_int_map = mp::mp_list<i8, std::int16_t, std::int32_t, std::int64_t>;
24
25template <std::size_t I>
26using sized_int_impl = mp::mp_at<sized_int_map, mp::mp_int<I>>;
27
28template <std::size_t I>
29using sized_uint_impl = mp::mp_at<sized_uint_map, mp::mp_int<I>>;
30} // namespace detail
31
32template <std::size_t NumBits>
33using sized_int_t = detail::sized_int_impl<std::bit_width(NumBits) - 1>;
34
35template <std::size_t NumBits>
36using sized_uint_t = detail::sized_uint_impl<std::bit_width(NumBits) - 1>;
37
49template <typename IntType>
50 requires std::integral<std::decay_t<IntType>>
51constexpr std::size_t digits10_max_count = std::numeric_limits<std::decay_t<IntType>>::digits10 + 1;
52
53static_assert(digits10_max_count<i8> == 3);
54static_assert(digits10_max_count<u8> == 3);
55static_assert(digits10_max_count<i16> == 5);
56static_assert(digits10_max_count<u16> == 5);
57static_assert(digits10_max_count<i32> == 10);
58static_assert(digits10_max_count<u32> == 10);
59static_assert(digits10_max_count<i64> == 19);
60static_assert(digits10_max_count<u64> == 20);
61
62} // namespace asmgrader
mp::mp_at< sized_int_map, mp::mp_int< I > > sized_int_impl
Definition integer.hpp:26
mp::mp_list< i8, std::int16_t, std::int32_t, std::int64_t > sized_int_map
Definition integer.hpp:23
mp::mp_at< sized_uint_map, mp::mp_int< I > > sized_uint_impl
Definition integer.hpp:29
mp::mp_list< u8, std::uint16_t, std::uint32_t, std::uint64_t > sized_uint_map
Definition integer.hpp:22
Definition asm_buffer.hpp:19
detail::sized_uint_impl< std::bit_width(NumBits) - 1 > sized_uint_t
Definition integer.hpp:36
detail::sized_int_impl< std::bit_width(NumBits) - 1 > sized_int_t
Definition integer.hpp:33
constexpr std::size_t digits10_max_count
This was a little confusing (to me at least) digits10 => maximum number of base-10 digits that can be...
Definition integer.hpp:51