9#include <kernel/util/string.hpp>
27 using i8 = std::int8_t;
29 using i16 = std::int16_t;
31 using i32 = std::int32_t;
33 using i64 = std::int64_t;
36 using u8 = std::uint8_t;
38 using u16 = std::uint16_t;
40 using u32 = std::uint32_t;
42 using u64 = std::uint64_t;
44#if defined(FEAT_HAVE_HALFMATH) || defined(DOXYGEN)
45#define FEAT_HAVE_PACK_TYPE_F16 1
50 static_assert(
sizeof(
f16) == 2,
"16-bit float is assumed to have exactly 16 bits");
58#if defined(FEAT_HAVE_QUADMATH) || defined(DOYGEN)
59#define FEAT_HAVE_PACK_TYPE_F128 1
61 using f128 = __float128;
63 static_assert(
sizeof(f128) == 16,
"128-bit float is assumed to have exactly 128 bits");
146 case Pack::Type::F16:
return os <<
"F16";
147 case Pack::Type::F32:
return os <<
"F32";
148 case Pack::Type::F64:
return os <<
"F64";
149 case Pack::Type::F128:
return os <<
"F128";
150 case Pack::Type::I8:
return os <<
"I8";
151 case Pack::Type::I16:
return os <<
"I16";
152 case Pack::Type::I32:
return os <<
"I32";
153 case Pack::Type::I64:
return os <<
"I64";
154 case Pack::Type::U8:
return os <<
"U8";
155 case Pack::Type::U16:
return os <<
"U16";
156 case Pack::Type::U32:
return os <<
"U32";
157 case Pack::Type::U64:
return os <<
"U64";
159 case Pack::Type::ZF16:
return os <<
"ZF16";
160 case Pack::Type::ZF32:
return os <<
"ZF32";
161 case Pack::Type::ZF64:
return os <<
"ZF64";
162 case Pack::Type::ZF128:
return os <<
"ZF128";
163 case Pack::Type::ZI8:
return os <<
"ZI8";
164 case Pack::Type::ZI16:
return os <<
"ZI16";
165 case Pack::Type::ZI32:
return os <<
"ZI32";
166 case Pack::Type::ZI64:
return os <<
"ZI64";
167 case Pack::Type::ZU8:
return os <<
"ZU8";
168 case Pack::Type::ZU16:
return os <<
"ZU16";
169 case Pack::Type::ZU32:
return os <<
"ZU32";
170 case Pack::Type::ZU64:
return os <<
"ZU64";
171 case Pack::Type::PF32:
return os <<
"PF32";
172 case Pack::Type::PF64:
return os <<
"PF64";
173 default:
return os <<
"???";
194 t = Pack::Type::F128;
214 t = Pack::Type::ZF16;
216 t = Pack::Type::ZF32;
218 t = Pack::Type::ZF64;
220 t = Pack::Type::ZF128;
224 t = Pack::Type::ZI16;
226 t = Pack::Type::ZI32;
228 t = Pack::Type::ZI64;
232 t = Pack::Type::ZU16;
234 t = Pack::Type::ZU32;
236 t = Pack::Type::ZU64;
238 t = Pack::Type::PF32;
240 t = Pack::Type::PF64;
242 is.setstate(std::ios_base::failbit);
260 constexpr auto size_mask = 0xFULL;
261 return std::size_t(1) << ((
static_cast<u16>(type) & size_mask) - 1);
276 template<
typename T_>
323 template<
typename T_>
327 std::size_t buf_size,
331 double tolerance = 1e-16);
359 template<
typename T_>
364 std::size_t buf_size,
String class implementation.
int compare_no_case(const String &other) const
Compares two strings without regard to case.
Data Array Pack namespace.
Pack::Type operator|(Pack::Type a, Pack::Type b)
bit-wise OR operator for Pack::Type
std::int32_t i32
32-bit signed integer type
std::size_t encode(void *buf, const T_ *src, const std::size_t buf_size, const std::size_t count, const Pack::Type pack_type, bool swap_bytes, double tolerance)
Encodes an array into a packed buffer.
std::uint64_t u64
64-bit unsigned integer type
std::size_t element_size(const Pack::Type type)
Returns the size of a Pack::Type element in bytes.
Pack::Type operator&(Pack::Type a, Pack::Type b)
bit-wise AND operator for Pack::Type
std::size_t estimate_size(const std::size_t count, const Pack::Type type, const double tolerance)
Computes the estimated (upper bound) pack buffer size for an array.
String base64_encode(const Pack::u8 *begin, const Pack::u8 *end)
Encodes bytes into a Base64 string.
std::istream & operator>>(std::istream &is, Pack::Type &t)
stream input operator for Pack::Type
std::ostream & operator<<(std::ostream &os, Pack::Type t)
stream output operator for Pack::Type
Half f16
16-bit floating point type
float f32
32-bit floating point type
std::int16_t i16
16-bit signed integer type
std::uint32_t u32
32-bit unsigned integer type
std::int64_t i64
64-bit signed integer type
std::uint16_t u16
16-bit unsigned integer type
std::int8_t i8
8-bit signed integer type
double f64
64-bit floating point type
std::size_t decode(T_ *dst, void *buf, const std::size_t count, const std::size_t buf_size, const Pack::Type pack_type, bool swap_bytes)
Decodes an array from a packed buffer.
std::uint8_t u8
8-bit unsigned integer type
Pack::Type deduct_type()
Deduct the (raw) Pack::Type from a given data type T_.
bool is_valid_base64_string(const String &s)
std::vector< Pack::u8 > base64_decode(const String &s)
Decodes a Base64 string into bytes.
__half Half
Half data type.