/*!@file \brief HENGE Memory Definition in common with STON Asset Packages \details C Aligned memory structures used to define datatypes in the STON Asset Package format, used for reading asset packages as runtime memory. \author Ken Grimes \date Feb 2017 ----------------------------------------------------------------------------*/ #ifndef _HENGE_H_ #define _HENGE_H_ /* Henge Generic Hashtable Hashtables are stored as dynamically sized two dimensional arrays, whose columns are provided, and whose rows, and sizes, are derived. ht_size = header.ht_columns << header.ht_2pow; ht_rows = 0x1 << header.ht_2pow; All generic hashtables in henge must have a power-of-two number of rows. An ht_columns value that is also a power-of-two will result in a power-of-two sized memory imprint for the structure, making it easy to page align. Elements in the columns may be of any arbitrary size. typedef uint32_t my_ht_type; ht_bytes = ht_size * sizeof(my_ht_type); */ struct hng_ht_header_t { uint16_t ht_columns; uint8_t ht_2pow, ht_flags; }; #define hng_ht_size(_HEADER) ((_HEADER)->ht_columns << (_HEADER)->ht_2pow) #define hng_ht_rows(_HEADER) (0x1 << (_HEADER)->ht_2pow) #define hng_ht_cols(_HEADER) (_HEADER->ht_columns) #define hng_ht_start(_HEADER) (_HEADER + sizeof(*_HEADER)) #define hng_ht_array(_HEADER,_UNIT) ((_UNIT*)hng_ht_start(_HEADER)) #define hng_ht_bytes(_HEADER,_UNIT) (hng_ht_size(_HEADER) * sizeof(_UNIT)) #define hng_ht_2bytes(_HEADER,_UNIT2POW) (hng_ht_size(_HEADER) << _UNIT2POW) #endif //_HENGE_H_