#pragma once #include #include #include #include #include #include namespace ztu { namespace uix { using u8 = std::uint8_t; using u16 = std::uint16_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using usize = std::size_t; using i8 = std::int8_t; using i16 = std::int16_t; using i32 = std::int32_t; using i64 = std::int64_t; using isize = ssize_t; [[maybe_unused]] static constexpr auto u8_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto u16_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto u32_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto u64_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto usize_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto i8_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto i16_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto i32_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto i64_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto isize_max = std::numeric_limits::max(); [[maybe_unused]] static constexpr auto u8_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto u16_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto u32_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto u64_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto usize_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto i8_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto i16_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto i32_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto i64_min = std::numeric_limits::min(); [[maybe_unused]] static constexpr auto isize_min = std::numeric_limits::min(); } // namespace ztu using namespace uix; namespace detail { template struct pack_at {}; template requires (Index > 0) struct pack_at { using type = pack_at::type; }; template struct pack_at<0, T, Ts...> { using type = T; }; } template using uint_t = detail::pack_at::type; template requires (N > 0) using uint_holding = uint_t<(std::bit_width(static_cast(N)) + 7) / 8>; template using int_t = detail::pack_at::type; template requires (N != 0) using int_holding = int_t< std::bit_width( N < 0 ? std::max(static_cast(-(N + 1)), static_cast(1)) : static_cast(N) ) / 8 + 1 >; } // namespace ztu