7 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4 ||
sizeof(T) == 2 ||
sizeof(T) == 1,
"size must be 1, 2, 4, 8");
9 static_cast<FwAssertArgType>(
sizeof(T)));
13 memcpy(valBytes, this->
top() -
sizeof(T),
sizeof(T));
18 return static_cast<T
>((
static_cast<T
>(valBytes[7]) << 0) | (
static_cast<T
>(valBytes[6]) << 8) |
19 (
static_cast<T
>(valBytes[5]) << 16) | (
static_cast<T
>(valBytes[4]) << 24) |
20 (
static_cast<T
>(valBytes[3]) << 32) | (
static_cast<T
>(valBytes[2]) << 40) |
21 (
static_cast<T
>(valBytes[1]) << 48) | (
static_cast<T
>(valBytes[0]) << 56));
22 }
else if (
sizeof(T) == 4) {
23 return static_cast<T
>((
static_cast<T
>(valBytes[3]) << 0) | (
static_cast<T
>(valBytes[2]) << 8) |
24 (
static_cast<T
>(valBytes[1]) << 16) | (
static_cast<T
>(valBytes[0]) << 24));
25 }
else if (
sizeof(T) == 2) {
26 return static_cast<T
>((
static_cast<T
>(valBytes[1]) << 0) | (
static_cast<T
>(valBytes[0]) << 8));
28 return static_cast<T
>(valBytes[0]);
42 F32 FpySequencer::Stack::pop<F32>() {
43 U32 endianness = this->pop<U32>();
45 memcpy(&val, &endianness,
sizeof(val));
50 F64 FpySequencer::Stack::pop<F64>() {
51 U64 endianness = this->pop<U64>();
53 memcpy(&val, &endianness,
sizeof(val));
59 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4 ||
sizeof(T) == 2 ||
sizeof(T) == 1,
"size must be 1, 2, 4, 8");
61 static_cast<FwAssertArgType>(
sizeof(T)));
65 using UnsignedT =
typename std::make_unsigned<T>::type;
66 UnsignedT valUnsigned =
static_cast<UnsignedT
>(val);
68 valBytes[0] =
static_cast<U8>(valUnsigned >> 56);
69 valBytes[1] =
static_cast<U8>(valUnsigned >> 48);
70 valBytes[2] =
static_cast<U8>(valUnsigned >> 40);
71 valBytes[3] =
static_cast<U8>(valUnsigned >> 32);
72 valBytes[4] =
static_cast<U8>(valUnsigned >> 24);
73 valBytes[5] =
static_cast<U8>(valUnsigned >> 16);
74 valBytes[6] =
static_cast<U8>(valUnsigned >> 8);
75 valBytes[7] =
static_cast<U8>(valUnsigned >> 0);
76 }
else if (
sizeof(T) == 4) {
77 valBytes[0] =
static_cast<U8>(valUnsigned >> 24);
78 valBytes[1] =
static_cast<U8>(valUnsigned >> 16);
79 valBytes[2] =
static_cast<U8>(valUnsigned >> 8);
80 valBytes[3] =
static_cast<U8>(valUnsigned >> 0);
81 }
else if (
sizeof(T) == 2) {
82 valBytes[0] =
static_cast<U8>(valUnsigned >> 8);
83 valBytes[1] =
static_cast<U8>(valUnsigned >> 0);
85 valBytes[0] =
static_cast<U8>(valUnsigned);
87 memcpy(this->top(), valBytes,
sizeof(T));
101 void FpySequencer::Stack::push<F32>(
F32 val) {
103 memcpy(&endianness, &val,
sizeof(val));
104 this->push(endianness);
108 void FpySequencer::Stack::push<F64>(
F64 val) {
110 memcpy(&endianness, &val,
sizeof(val));
111 this->push(endianness);
117 FW_ASSERT(this->size >= destSize, static_cast<FwAssertArgType>(this->size), static_cast<FwAssertArgType>(destSize));
118 memcpy(dest, this->top() - destSize, destSize);
119 this->size -= destSize;
127 static_cast<FwAssertArgType>(srcSize));
128 memcpy(this->top(), src, srcSize);
129 this->size += srcSize;
135 static_cast<FwAssertArgType>(byteCount));
136 memset(this->top(), 0, byteCount);
137 this->size += byteCount;
141 return &this->bytes[this->size];
145 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 ...