7using u8 = std::uint8_t;
8using i16 = std::int16_t;
9using u16 = std::uint16_t;
10using i32 = std::int32_t;
11using u32 = std::uint32_t;
12using i64 = std::int64_t;
13using u64 = std::uint64_t;
27template<
typename T>
struct ptr {
34#define STRCAT_INNER(a, b) a##b
35#define STRCAT(a, b) STRCAT_INNER(a, b)
39 { T::N } -> std::same_as<const u32 &>;
44 static const constexpr u32 N = dims;
60concept NotVoid = !std::is_same_v<T, void>;
63concept Optional = std::same_as<T, std::optional<typename T::value_type>>;
65template<
typename T,
typename V>
66concept OptionalValue = std::same_as<V, std::optional<typename T::value_type>>;
static const constexpr u32 N
ptr< void >::value void_ptr