20 constexpr PointerPair(
const void* p1,
const void* p2) :
P1(p1),
P2(p2) {}
67 #elif ALIB_SIZEOF_INTEGER != 4
70 #elif ALIB_SIZEOF_INTEGER != 8
78 int8_t
Array8 [2 *
sizeof(
void*) /
sizeof( int8_t )];
79 int16_t
Array16 [2 *
sizeof(
void*) /
sizeof( int16_t )];
82 int32_t
Array32 [2 *
sizeof(
void*) /
sizeof( int32_t )];
83 int64_t
Array64 [2 *
sizeof(
void*) /
sizeof( int64_t )];
85 #elif ALIB_SIZEOF_INTEGER != 4
86 int32_t
Array32 [2 *
sizeof(
void*) /
sizeof( int32_t )];
87 #elif ALIB_SIZEOF_INTEGER != 8
88 int64_t
Array64 [2 *
sizeof(
void*) /
sizeof( int64_t )];
115 #if ALIB_SIZEOF_INTEGER != 4
124 #elif ALIB_SIZEOF_INTEGER != 8
137 #if ALIB_SIZEOF_INTGAP == 2
144 #elif ALIB_SIZEOF_INTGAP == 4
145 #if ALIB_SIZEOF_INTEGER != 4
160 #elif ALIB_SIZEOF_INTGAP == 8
161 #if ALIB_SIZEOF_INTEGER != 8
173 #error "ALIB_SIZEOF_INTGAP not matched. Supported sizes are 2, 4 and 8."
206 std::array<char, 1>
C1;
207 std::array<char, 2>
C2;
208 std::array<char, 3>
C3;
209 std::array<char, 4>
C4;
210 std::array<char, 5>
C5;
211 std::array<char, 6>
C6;
212 std::array<char, 7>
C7;
213 std::array<char, 8>
C8;
214 #if ALIB_SIZEOF_INTEGER == 8
215 std::array<char, 9>
C9;
309 template<
typename TPo
inter>
312 template<
typename TP1,
typename TP2>
316 template<
typename TI>
317 requires std::is_integral_v<TI>
320 template<
typename TI1,
typename TI2>
321 requires (std::is_integral_v<TI1> && std::is_integral_v<TI2> )
329 template<
typename TArray,
typename TIntegral>
330 requires std::is_integral_v<TIntegral>
331 constexpr Placeholder(
const TArray* tpointer, TIntegral length )
343 template<
typename TReturn>
349 template<
typename TReturn>
370 template<
unsigned UsageLength>
372 static_assert( UsageLength > 0 && ( UsageLength <= 2 *
sizeof(
void*) ),
373 "Invalid usage length given" );
376 if constexpr( UsageLength >
sizeof(
void*) )
387 template<
typename TIntegral>
388 requires( std::is_integral_v<TIntegral> )
389 constexpr void Write(
const TIntegral& value ) {
391 if constexpr( std::is_signed_v<TIntegral>) {
393 if constexpr(
sizeof(TIntegral) == 1 )
Integrals.Int8 = int8_t (value);
394 else if constexpr(
sizeof(TIntegral) == 2 )
Integrals.Int16 = int16_t(value);
395 #if ALIB_SIZEOF_INTEGER == 4
397 else if constexpr(
sizeof(TIntegral) == 8 )
Integrals.Int64 = int64_t(value);
399 else if constexpr(
sizeof(TIntegral) == 4 )
Integrals.Int32 = int32_t(value);
403 if constexpr(
sizeof(TIntegral) == 1 )
Integrals.UInt8 = uint8_t (value);
404 else if constexpr(
sizeof(TIntegral) == 2 )
Integrals.UInt16= uint16_t(value);
405 #if ALIB_SIZEOF_INTEGER == 4
407 else if constexpr(
sizeof(TIntegral) == 8 )
Integrals.UInt64= uint64_t(value);
409 else if constexpr(
sizeof(TIntegral) == 4 )
Integrals.UInt32= uint32_t(value);
417 template<
typename TFloat>
418 requires( std::is_floating_point_v<TFloat> )
419 constexpr void Write(
const TFloat& value ) {
420 if constexpr( std::same_as<TFloat, float > )
FloatingPoints.Float = value;
421 else if constexpr( std::same_as<TFloat, double> )
FloatingPoints.Double= value;
435 template<
typename TTrivial>
436 requires( std::is_trivially_copyable_v<TTrivial>
437 && (
sizeof(TTrivial) <= 2 *
sizeof(
void*))
438 && !std::is_pointer_v<TTrivial>
439 && !std::is_integral_v<TTrivial>
440 && !std::is_floating_point_v<TTrivial> )
441 constexpr void Write(
const TTrivial& value ) {
443 if constexpr(
sizeof(TTrivial) == 1 )
Bytes.C1 = std::bit_cast<std::array<char, 1>>( value );
444 else if constexpr(
sizeof(TTrivial) == 2 )
Bytes.C2 = std::bit_cast<std::array<char, 2>>( value );
445 else if constexpr(
sizeof(TTrivial) == 3 )
Bytes.C3 = std::bit_cast<std::array<char, 3>>( value );
446 else if constexpr(
sizeof(TTrivial) == 4 )
Bytes.C4 = std::bit_cast<std::array<char, 4>>( value );
447 else if constexpr(
sizeof(TTrivial) == 5 )
Bytes.C5 = std::bit_cast<std::array<char, 5>>( value );
448 else if constexpr(
sizeof(TTrivial) == 6 )
Bytes.C6 = std::bit_cast<std::array<char, 6>>( value );
449 else if constexpr(
sizeof(TTrivial) == 7 )
Bytes.C7 = std::bit_cast<std::array<char, 7>>( value );
450 else if constexpr(
sizeof(TTrivial) == 8 )
Bytes.C8 = std::bit_cast<std::array<char, 8>>( value );
451 #if ALIB_SIZEOF_INTEGER == 8
452 else if constexpr(
sizeof(TTrivial) == 9 )
Bytes.C9 = std::bit_cast<std::array<char, 9>>( value );
453 else if constexpr(
sizeof(TTrivial) == 10 )
Bytes.C10= std::bit_cast<std::array<char, 10>>( value );
454 else if constexpr(
sizeof(TTrivial) == 11 )
Bytes.C11= std::bit_cast<std::array<char, 11>>( value );
455 else if constexpr(
sizeof(TTrivial) == 12 )
Bytes.C12= std::bit_cast<std::array<char, 12>>( value );
456 else if constexpr(
sizeof(TTrivial) == 13 )
Bytes.C13= std::bit_cast<std::array<char, 13>>( value );
457 else if constexpr(
sizeof(TTrivial) == 14 )
Bytes.C14= std::bit_cast<std::array<char, 14>>( value );
458 else if constexpr(
sizeof(TTrivial) == 15 )
Bytes.C15= std::bit_cast<std::array<char, 15>>( value );
459 else if constexpr(
sizeof(TTrivial) == 16 )
Bytes.C16= std::bit_cast<std::array<char, 16>>( value );
479 template<
typename T1,
typename T2>
480 requires( std::is_trivially_copyable_v<T1> && !std::is_pointer_v<T1>
481 && std::is_trivially_copyable_v<T2> && !std::is_pointer_v<T2>
482 && (
sizeof(T1) +
sizeof(T2) <= 2 *
sizeof(
void*) )
484 constexpr void Write(
const T1& v1,
const T2& v2 ) {
487 #pragma pack(push, 1)
494 static_assert(
sizeof(PackedTuple) ==
sizeof(T1) +
sizeof(T2),
495 "PackedTuple has unexpected padding!");
498 PackedTuple value { v1, v2 };
500 if constexpr(
sizeof(PackedTuple) == 1 )
Bytes.C1 = std::bit_cast<std::array<char, 1>>( value );
501 else if constexpr(
sizeof(PackedTuple) == 2 )
Bytes.C2 = std::bit_cast<std::array<char, 2>>( value );
502 else if constexpr(
sizeof(PackedTuple) == 3 )
Bytes.C3 = std::bit_cast<std::array<char, 3>>( value );
503 else if constexpr(
sizeof(PackedTuple) == 4 )
Bytes.C4 = std::bit_cast<std::array<char, 4>>( value );
504 else if constexpr(
sizeof(PackedTuple) == 5 )
Bytes.C5 = std::bit_cast<std::array<char, 5>>( value );
505 else if constexpr(
sizeof(PackedTuple) == 6 )
Bytes.C6 = std::bit_cast<std::array<char, 6>>( value );
506 else if constexpr(
sizeof(PackedTuple) == 7 )
Bytes.C7 = std::bit_cast<std::array<char, 7>>( value );
507 else if constexpr(
sizeof(PackedTuple) == 8 )
Bytes.C8 = std::bit_cast<std::array<char, 8>>( value );
508 #if ALIB_SIZEOF_INTEGER == 8
509 else if constexpr(
sizeof(PackedTuple) == 9 )
Bytes.C9 = std::bit_cast<std::array<char, 9>>( value );
510 else if constexpr(
sizeof(PackedTuple) == 10 )
Bytes.C10= std::bit_cast<std::array<char, 10>>( value );
511 else if constexpr(
sizeof(PackedTuple) == 11 )
Bytes.C11= std::bit_cast<std::array<char, 11>>( value );
512 else if constexpr(
sizeof(PackedTuple) == 12 )
Bytes.C12= std::bit_cast<std::array<char, 12>>( value );
513 else if constexpr(
sizeof(PackedTuple) == 13 )
Bytes.C13= std::bit_cast<std::array<char, 13>>( value );
514 else if constexpr(
sizeof(PackedTuple) == 14 )
Bytes.C14= std::bit_cast<std::array<char, 14>>( value );
515 else if constexpr(
sizeof(PackedTuple) == 15 )
Bytes.C15= std::bit_cast<std::array<char, 15>>( value );
516 else if constexpr(
sizeof(PackedTuple) == 16 )
Bytes.C16= std::bit_cast<std::array<char, 16>>( value );
529 template<
typename TPo
inter>
543 template<
typename TArray>
552 template<
typename TP1,
typename TP2>
570 template<
typename TPo
inter>
571 requires( !std::is_trivially_copyable_v<TPointer>
572 && (
sizeof(TPointer) <= 2 *
sizeof(
void*)) )
574 { std::memcpy( &
PointerPair.P1, &value,
sizeof(TPointer) ); }
588 template<
typename TMapped>
589 requires( !( std::is_trivially_copyable_v<TMapped>
590 && (
sizeof(TMapped) <= 2 *
sizeof(
void*)) )
591 && !std::is_pointer_v<TMapped>
596 template<
typename TMapped>
597 requires( !( std::is_trivially_copyable_v<TMapped>
598 && (
sizeof(TMapped) <= 2 *
sizeof(
void*)) )
599 && !std::is_pointer_v<TMapped>
601 TMapped
Read()
const {
return *
reinterpret_cast<const TMapped*
>( this ); }
603 template<
typename TPo
inter>
604 requires std::is_pointer_v<TPointer>
605 constexpr TPointer
Read()
const {
606 if constexpr (std::same_as<TPointer, void*>)
608 return static_cast<TPointer
>(
VoidP );
611 template<
typename TIntegral>
612 requires( std::is_integral_v<TIntegral> )
613 constexpr TIntegral
Read()
const {
615 if constexpr( std::is_signed_v<TIntegral>) {
617 if constexpr(
sizeof(TIntegral) == 1 )
return TIntegral(
Integrals.
Int8 );
618 else if constexpr(
sizeof(TIntegral) == 2 )
return TIntegral(
Integrals.
Int16);
619 #if ALIB_SIZEOF_INTEGER == 4
620 else if constexpr(
sizeof(TIntegral) == 4 )
return TIntegral(
Integrals.
Int );
621 else if constexpr(
sizeof(TIntegral) == 8 )
return TIntegral(
Integrals.
Int64);
623 else if constexpr(
sizeof(TIntegral) == 4 )
return TIntegral(
Integrals.
Int32);
624 else if constexpr(
sizeof(TIntegral) == 8 )
return TIntegral(
Integrals.
Int );
627 if constexpr(
sizeof(TIntegral) == 1 )
return TIntegral(
Integrals.
UInt8 );
628 else if constexpr(
sizeof(TIntegral) == 2 )
return TIntegral(
Integrals.
UInt16);
629 #if ALIB_SIZEOF_INTEGER == 4
630 else if constexpr(
sizeof(TIntegral) == 4 )
return TIntegral(
Integrals.
UInt );
631 else if constexpr(
sizeof(TIntegral) == 8 )
return TIntegral(
Integrals.
UInt64);
633 else if constexpr(
sizeof(TIntegral) == 4 )
return TIntegral(
Integrals.
UInt32);
634 else if constexpr(
sizeof(TIntegral) == 8 )
return TIntegral(
Integrals.
UInt );
638 template<
typename TFloat>
639 requires( std::is_floating_point_v<TFloat> )
640 constexpr TFloat
Read()
const {
641 if constexpr( std::same_as<TFloat, float > )
return TFloat(
FloatingPoints.Float );
642 else if constexpr( std::same_as<TFloat, double> )
return TFloat(
FloatingPoints.Double);
645 template<
typename TTrivial>
646 requires( std::is_trivially_copyable_v<TTrivial>
647 && (
sizeof(TTrivial) <= 2 *
sizeof(
void*))
648 && !std::is_pointer_v<TTrivial>
649 && !std::is_integral_v<TTrivial>
650 && !std::is_floating_point_v<TTrivial>
652 constexpr TTrivial
Read()
const {
654 if constexpr(
sizeof(TTrivial) == 1 )
return std::bit_cast<TTrivial>(
Bytes.C1);
655 else if constexpr(
sizeof(TTrivial) == 2 )
return std::bit_cast<TTrivial>(
Bytes.C2);
656 else if constexpr(
sizeof(TTrivial) == 3 )
return std::bit_cast<TTrivial>(
Bytes.C3);
657 else if constexpr(
sizeof(TTrivial) == 4 )
return std::bit_cast<TTrivial>(
Bytes.C4);
658 else if constexpr(
sizeof(TTrivial) == 5 )
return std::bit_cast<TTrivial>(
Bytes.C5);
659 else if constexpr(
sizeof(TTrivial) == 6 )
return std::bit_cast<TTrivial>(
Bytes.C6);
660 else if constexpr(
sizeof(TTrivial) == 7 )
return std::bit_cast<TTrivial>(
Bytes.C7);
661 else if constexpr(
sizeof(TTrivial) == 8 )
return std::bit_cast<TTrivial>(
Bytes.C8);
662 #if ALIB_SIZEOF_INTEGER == 8
663 else if constexpr(
sizeof(TTrivial) == 9 )
return std::bit_cast<TTrivial>(
Bytes.C9 );
664 else if constexpr(
sizeof(TTrivial) == 10 )
return std::bit_cast<TTrivial>(
Bytes.C10);
665 else if constexpr(
sizeof(TTrivial) == 11 )
return std::bit_cast<TTrivial>(
Bytes.C11);
666 else if constexpr(
sizeof(TTrivial) == 12 )
return std::bit_cast<TTrivial>(
Bytes.C12);
667 else if constexpr(
sizeof(TTrivial) == 13 )
return std::bit_cast<TTrivial>(
Bytes.C13);
668 else if constexpr(
sizeof(TTrivial) == 14 )
return std::bit_cast<TTrivial>(
Bytes.C14);
669 else if constexpr(
sizeof(TTrivial) == 15 )
return std::bit_cast<TTrivial>(
Bytes.C15);
670 else if constexpr(
sizeof(TTrivial) == 16 )
return std::bit_cast<TTrivial>(
Bytes.C16);
681 template<
typename TTrivial1,
typename TTrivial2>
682 requires( std::is_trivially_copyable_v<TTrivial1> && !std::is_pointer_v<TTrivial1>
683 && std::is_trivially_copyable_v<TTrivial2> && !std::is_pointer_v<TTrivial2>
684 && (
sizeof(TTrivial1) +
sizeof(TTrivial2) <= 2 *
sizeof(
void*) )
686 constexpr void Read(TTrivial1& v1, TTrivial2& v2)
const {
689 #pragma pack(push, 1)
696 static_assert(
sizeof(PT) ==
sizeof(TTrivial1) +
sizeof(TTrivial2),
697 "PackedTuple has unexpected padding!");
701 if constexpr(
sizeof(PT) == 1 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C1); v1 = pt.v1; v2 = pt.v2; }
702 else if constexpr(
sizeof(PT) == 2 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C2); v1 = pt.v1; v2 = pt.v2; }
703 else if constexpr(
sizeof(PT) == 3 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C3); v1 = pt.v1; v2 = pt.v2; }
704 else if constexpr(
sizeof(PT) == 4 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C4); v1 = pt.v1; v2 = pt.v2; }
705 else if constexpr(
sizeof(PT) == 5 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C5); v1 = pt.v1; v2 = pt.v2; }
706 else if constexpr(
sizeof(PT) == 6 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C6); v1 = pt.v1; v2 = pt.v2; }
707 else if constexpr(
sizeof(PT) == 7 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C7); v1 = pt.v1; v2 = pt.v2; }
708 else if constexpr(
sizeof(PT) == 8 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C8); v1 = pt.v1; v2 = pt.v2; }
709 #if ALIB_SIZEOF_INTEGER > 4
710 else if constexpr(
sizeof(PT) == 9 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C9); v1 = pt.v1; v2 = pt.v2; }
711 else if constexpr(
sizeof(PT) == 10 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C10); v1 = pt.v1; v2 = pt.v2; }
712 else if constexpr(
sizeof(PT) == 11 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C11); v1 = pt.v1; v2 = pt.v2; }
713 else if constexpr(
sizeof(PT) == 12 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C12); v1 = pt.v1; v2 = pt.v2; }
714 else if constexpr(
sizeof(PT) == 13 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C13); v1 = pt.v1; v2 = pt.v2; }
715 else if constexpr(
sizeof(PT) == 14 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C14); v1 = pt.v1; v2 = pt.v2; }
716 else if constexpr(
sizeof(PT) == 15 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C15); v1 = pt.v1; v2 = pt.v2; }
717 else if constexpr(
sizeof(PT) == 16 ) {
const auto pt = std::bit_cast<PT>(
Bytes.C16); v1 = pt.v1; v2 = pt.v2; }
722static_assert(
sizeof(Placeholder) == 2 *
sizeof(std::size_t),
723 "Size of boxing::Placeholder is not two times the size of 'size_t'. "
724 "Compilation platform not supported." );
735template <
typename T1,
typename T2>
736requires ( std::is_trivially_copyable_v<T1>
737 && std::is_trivially_copyable_v<T2>
738 && (
sizeof(T1) +
sizeof(T2) <= 2 *
sizeof(
void*) )
753template <
typename T1,
typename T2>
754requires ( std::is_trivially_copyable_v<T1>
755 && std::is_trivially_copyable_v<T2>
756 && (
sizeof(T1) +
sizeof(T2) <= 2 *
sizeof(
void*) )
763template <
typename T,
typename U>
This namespace implements internals of namespace #"alib::boxing;2".
constexpr Pair< T1, T2 > MakePair(const T1 &t1, const T2 &t2)
lang::intGap_t intGap_t
Type alias in namespace #"%alib".
lang::integer integer
Type alias in namespace #"%alib".
lang::uintGap_t uintGap_t
Type alias in namespace #"%alib".
boxing::Pair< T, U > Pair
Type alias in namespace #"%alib".
characters::character character
Type alias in namespace #"%alib".
lang::uinteger uinteger
Type alias in namespace #"%alib".
constexpr PointerPairMutable(void *p1)
void * P2
The second pointer.
void * P1
The first pointer.
constexpr PointerPairMutable(void *p1, void *p2)
const void * P1
The first pointer.
const void * P2
The second pointer.
integer Length
The length of the array.
const void * Pointer
The pointer to the array.
constexpr StructArray(const void *p, integer l)
detail::PointerPair PointerPair
Collection of two const void pointers.
detail::UnionFloatingPoints FloatingPoints
Collection of floating points of different sizes.
constexpr void Write(const TTrivial &value)
constexpr integer GetLength() const
integer Debugger_Integral
This union field was inserted only for debug display.
constexpr void Write(const TArray *pointer, integer length)
constexpr void Write(const TIntegral &value)
constexpr void Read(TTrivial1 &v1, TTrivial2 &v2) const
character * Debugger_String
This union field was inserted only for debug display.
detail::StructArray Array
Used when storing C++ arrays.
constexpr Placeholder()
Default constructor. Leaves everything uninitialized.
constexpr void Write(const TPointer *pointer)
detail::UnionIntegrals Integrals
Collection of integrals of different sizes, placed next to each other.
TReturn * GetPointer2() const
detail::PointerPairMutable PointerPairMutable
Collection of two void pointers.
constexpr void Write(const TFloat &value)
constexpr const void * GetVoidPointer() const
constexpr void Write(const TP1 *p1, const TP2 *p2)
TReturn * GetPointer() const
void * VoidP
Just a void pointer.
constexpr void SetPointer(void *value)
constexpr void Write(const T1 &v1, const T2 &v2)
detail::UnionBytes Bytes
Byte arrays of different length.
std::array< char, 3 > C3
3 bytes.
std::array< char, 1 > C1
1 bytes.
std::array< char, 13 > C13
13 bytes.
std::array< char, 9 > C9
9 bytes.
std::array< char, 7 > C7
7 bytes.
std::array< char, 8 > C8
8 bytes.
std::array< char, 14 > C14
14 bytes.
std::array< char, 15 > C15
15 bytes.
std::array< char, 12 > C12
12 bytes.
std::array< char, 6 > C6
6 bytes.
std::array< char, 5 > C5
5 bytes.
std::array< char, 16 > C16
16 bytes.
std::array< char, 10 > C10
10 bytes.
std::array< char, 2 > C2
2 bytes.
std::array< char, 4 > C4
4 bytes.
std::array< char, 11 > C11
11 bytes.
float Float
A float value.
constexpr UnionFloatingPoints(float value)
float FloatArray[2 *sizeof(void *)/sizeof(float)]
Array of float. The Length is usually four on 64-bit platform, two on a 32-bit platform.
double Double
A double value.
double DoubleArray[2 *sizeof(void *)/sizeof(double)]
Array of double. The Length is usually two on 64-bit platform, one on a 32-bit platform.
constexpr UnionFloatingPoints(double value)
uint64_t UInt64
64-bit unsigned integral. Available only if platform is not of 64-bit.
int32_t Int32
32-bit signed integral. Available only if platform is not of 32-bit.
int8_t Int8
8-bit signed integral.
int16_t Array16[2 *sizeof(void *)/sizeof(int16_t)]
Array of 16-bit signed integrals of length 8 on 64-bit platform, 4 on a 32-bit platform.
constexpr UnionIntegrals(int32_t value)
constexpr UnionIntegrals(uint16_t value)
constexpr UnionIntegrals(integer value)
uint16_t UInt16
16-bit unsigned integral.
constexpr UnionIntegrals(uinteger value)
int32_t Array32[2 *sizeof(void *)/sizeof(int32_t)]
Array of 32-bit signed integrals of length 4 on a 64-bit platform. Not available on 32-bit platforms.
int64_t Int64
64-bit signed integral. Available only if platform is not of 64-bit.
constexpr UnionIntegrals(uint8_t value)
integer Int
Signed integral of platform-dependent size.
int64_t Array64[2 *sizeof(void *)/sizeof(int64_t)]
Array of 64-bit signed integrals of length 1 on a 32-bit platform. Not available on 64-bit platforms.
uinteger UInt
Unsigned integral of platform-dependent size.
uint8_t UInt8
8-bit unsigned integral.
int8_t Array8[2 *sizeof(void *)/sizeof(int8_t)]
Array of 8-bit signed integrals of length 16 on 64-bit platform, 8 on a 32-bit platform.
constexpr UnionIntegrals(uint32_t value)
constexpr UnionIntegrals(int16_t value)
uint32_t UInt32
32-bit unsigned integral. Available only if platform is not of 32-bit.
integer Array[2]
Array of 64-bit signed integrals of length two on 64-bit platform, one on a 32-bit platform.
uinteger UArray[2]
Array of 64-bit unsigned integrals of length two on 64-bit platform, one on a 32-bit platform.
constexpr UnionIntegrals(integer v1, integer v2)
int16_t Int16
16-bit signed integral.
constexpr UnionIntegrals(int8_t value)