#pragma once #include #include #include namespace ckitty { namespace bits { /** * Unpacks a value into bytes. */ template inline ckitty::array unpack(const T value, bool endianness) { const size bytelen = sizeof(T); ckitty::array bytes(bytelen); for(size i = 0; i < bytelen; i++) { size j = endianness ? bytelen - i - 1 : i; bytes[i] = (value >> (j * 8)) & 0xFF; } return bytes; } /** * Packs bytes into a value. */ template inline T pack(const u8* bytes, bool endianness) { const size bytelen = sizeof(T); T type(0); for(size i = 0; i < bytelen; i++) { size j = endianness ? bytelen - i - 1 : i; type |= T(bytes[i] << (j * 8)) & 0xFF; } return type; } template inline bool read(const T value, size bitno) { return (value >> bitno) & 1; } template inline T write(const T value, size bitno, bool bitval) { size mask = T(1) << bitno; return bitval ? (value | mask) : (value & ~mask); } template inline void write_r(T& value, size bitno, bool bitval) { value = write(value, bitno, bitval); } } }