#pragma once #include #include #include #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ # define pack_Nbit_(N) \ static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ *c = (*v >> s*8) & 0xff; \ } \ static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ biner_pack_l##N(v, c, N/8-s-1); \ } #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define pack_Nbit_(N) \ static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ *c = (*v >> s*8) & 0xff; \ } \ static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ biner_pack_b##N(v, c, N/8-s-1); \ } #else # error "byte order unknown" #endif pack_Nbit_(8); pack_Nbit_(16); pack_Nbit_(32); pack_Nbit_(64); #undef pack_Nbit_