A 3D game engine from scratch.
at main 45 lines 770 B view raw
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}