#ifndef ENDIAN_H #define ENDIAN_H #include #include //---------------------------------------------------------------- // FIXME: rename to endian namespace base { // These are just little wrapper types to make the compiler // understand that the le types are not assignable to the // corresponding cpu type. struct __le16 { explicit __le16(uint16_t v = 0) : v_(v) { } uint16_t v_; } __attribute__((packed)); struct __le32 { explicit __le32(uint32_t v = 0) : v_(v) { } uint32_t v_; } __attribute__((packed)); struct __le64 { explicit __le64(uint64_t v = 0) : v_(v) { } uint64_t v_; } __attribute__((packed)); //-------------------------------- // FIXME: actually do the conversions ! template CPUType to_cpu(DiskType const &d) { BOOST_STATIC_ASSERT(sizeof(d) == 0); } template DiskType to_disk(CPUType const &v) { BOOST_STATIC_ASSERT(sizeof(v) == 0); } template <> inline uint16_t to_cpu(__le16 const &d) { return d.v_; } template <> inline __le16 to_disk<__le16, uint16_t>(uint16_t const &v) { return __le16(v); } template <> inline uint32_t to_cpu(__le32 const &d) { return d.v_; } template <> inline __le32 to_disk<__le32, uint32_t>(uint32_t const &v) { return __le32(v); } template <> inline uint64_t to_cpu(__le64 const &d) { return d.v_; } template <> inline __le64 to_disk<__le64, uint64_t>(uint64_t const &v) { return __le64(v); } //-------------------------------- bool test_bit_le(void const *bits, unsigned b); void set_bit_le(void *bits, unsigned b); void clear_bit_le(void *bits, unsigned b); } //---------------------------------------------------------------- #endif