A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include "pack.hpp"
4
5
6void
7pack::init(Pack *pack)
8{
9 *pack = 0ULL;
10}
11
12
13void
14pack::set(Pack *pack, u8 value, u8 idx)
15{
16 assert(idx < MAX_LENGTH);
17 Pack mask = 0b1111ULL << (idx * ELEMENT_SIZE);
18 *pack = (*pack & ~mask) | (((Pack)value << (idx * ELEMENT_SIZE)) & mask);
19}
20
21
22u8
23pack::get(Pack *pack, u8 idx)
24{
25 Pack mask = 0b1111ULL << (idx * ELEMENT_SIZE);
26 return (u8)((*pack & mask) >> (idx * ELEMENT_SIZE));
27}
28
29
30u8
31pack::get_count(Pack *pack)
32{
33 return get(pack, COUNTER_IDX);
34}
35
36
37void
38pack::push(Pack *pack, u8 value)
39{
40 u8 count = get_count(pack);
41 // Last element is reserved for count;
42 assert(count < COUNTER_IDX);
43 set(pack, value, count);
44 set(pack, count + 1, COUNTER_IDX);
45}