6 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4 ||
sizeof(T) == 2 ||
sizeof(T) == 1,
"size must be 1, 2, 4, 8");
8 static_cast<FwAssertArgType>(
sizeof(T)));
12 memcpy(valBytes, this->
top() -
sizeof(T),
sizeof(T));
17 return static_cast<T
>((
static_cast<T
>(valBytes[7]) << 0) | (
static_cast<T
>(valBytes[6]) << 8) |
18 (
static_cast<T
>(valBytes[5]) << 16) | (
static_cast<T
>(valBytes[4]) << 24) |
19 (
static_cast<T
>(valBytes[3]) << 32) | (
static_cast<T
>(valBytes[2]) << 40) |
20 (
static_cast<T
>(valBytes[1]) << 48) | (
static_cast<T
>(valBytes[0]) << 56));
21 }
else if (
sizeof(T) == 4) {
22 return static_cast<T
>((
static_cast<T
>(valBytes[3]) << 0) | (
static_cast<T
>(valBytes[2]) << 8) |
23 (
static_cast<T
>(valBytes[1]) << 16) | (
static_cast<T
>(valBytes[0]) << 24));
24 }
else if (
sizeof(T) == 2) {
25 return static_cast<T
>((
static_cast<T
>(valBytes[1]) << 0) | (
static_cast<T
>(valBytes[0]) << 8));
27 return static_cast<T
>(valBytes[0]);
41 F32 FpySequencer::Stack::pop<F32>() {
42 U32 endianness = this->pop<U32>();
44 memcpy(&val, &endianness,
sizeof(val));
49 F64 FpySequencer::Stack::pop<F64>() {
50 U64 endianness = this->pop<U64>();
52 memcpy(&val, &endianness,
sizeof(val));
58 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4 ||
sizeof(T) == 2 ||
sizeof(T) == 1,
"size must be 1, 2, 4, 8");
60 static_cast<FwAssertArgType>(
sizeof(T)));
64 using UnsignedT =
typename std::make_unsigned<T>::type;
65 UnsignedT valUnsigned =
static_cast<UnsignedT
>(val);
67 valBytes[0] =
static_cast<U8>(valUnsigned >> 56);
68 valBytes[1] =
static_cast<U8>(valUnsigned >> 48);
69 valBytes[2] =
static_cast<U8>(valUnsigned >> 40);
70 valBytes[3] =
static_cast<U8>(valUnsigned >> 32);
71 valBytes[4] =
static_cast<U8>(valUnsigned >> 24);
72 valBytes[5] =
static_cast<U8>(valUnsigned >> 16);
73 valBytes[6] =
static_cast<U8>(valUnsigned >> 8);
74 valBytes[7] =
static_cast<U8>(valUnsigned >> 0);
75 }
else if (
sizeof(T) == 4) {
76 valBytes[0] =
static_cast<U8>(valUnsigned >> 24);
77 valBytes[1] =
static_cast<U8>(valUnsigned >> 16);
78 valBytes[2] =
static_cast<U8>(valUnsigned >> 8);
79 valBytes[3] =
static_cast<U8>(valUnsigned >> 0);
80 }
else if (
sizeof(T) == 2) {
81 valBytes[0] =
static_cast<U8>(valUnsigned >> 8);
82 valBytes[1] =
static_cast<U8>(valUnsigned >> 0);
84 valBytes[0] =
static_cast<U8>(valUnsigned);
86 memcpy(this->top(), valBytes,
sizeof(T));
100 void FpySequencer::Stack::push<F32>(
F32 val) {
102 memcpy(&endianness, &val,
sizeof(val));
103 this->push(endianness);
107 void FpySequencer::Stack::push<F64>(
F64 val) {
109 memcpy(&endianness, &val,
sizeof(val));
110 this->push(endianness);
116 FW_ASSERT(this->size >= destSize, static_cast<FwAssertArgType>(this->size), static_cast<FwAssertArgType>(destSize));
117 memcpy(dest, this->top() - destSize, destSize);
118 this->size -= destSize;
126 static_cast<FwAssertArgType>(srcSize));
127 memcpy(this->top(), src, srcSize);
128 this->size += srcSize;
134 static_cast<FwAssertArgType>(byteCount));
135 memset(this->top(), 0, byteCount);
136 this->size += byteCount;
140 return &this->bytes[this->size];
144 return this->bytes + this->lvarOffset();
Fpy::StackSizeType lvarOffset()
int8_t I8
8-bit signed integer
float F32
32-bit floating point
void pushZeroes(Fpy::StackSizeType byteCount)
uint8_t U8
8-bit unsigned integer
double F64
64-bit floating point (double). Required for compiler-supplied double promotion.
RateGroupDivider component implementation.
U32 StackSizeType
the type which everything referencing a size or offset on the stack is represented in ...