// Copyright (C) 2011 Red Hat, Inc. All rights reserved. // // This file is part of the thin-provisioning-tools source. // // thin-provisioning-tools is free software: you can redistribute it // and/or modify it under the terms of the GNU General Public License // as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // thin-provisioning-tools is distributed in the hope that it will be // useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with thin-provisioning-tools. If not, see // . #ifndef BASE_ENDIAN_H #define BASE_ENDIAN_H #include #include #include //---------------------------------------------------------------- /* An old glic doesn't provide these macros */ #if !defined(htole16) || !defined(le16toh) || !defined(htole32) || !defined(le32toh) || !defined(htole64) || !defined(le64toh) #include #if __BYTE_ORDER == __LITTLE_ENDIAN #define htole16(x) (x) #define le16toh(x) (x) #define htole32(x) (x) #define le32toh(x) (x) #define htole64(x) (x) #define le64toh(x) (x) #else #define htole16(x) __bswap_16(x) #define le16toh(x) __bswap_16(x) #define htole32(x) __bswap_32(x) #define le32toh(x) __bswap_32(x) #define htole64(x) __bswap_64(x) #define le64toh(x) __bswap_64(x) #endif #endif 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 le16toh(d.v_); } template <> inline le16 to_disk(uint16_t const &v) { return le16(htole16(v)); } template <> inline uint32_t to_cpu(le32 const &d) { return le32toh(d.v_); } template <> inline le32 to_disk(uint32_t const &v) { return le32(htole32(v)); } template <> inline uint64_t to_cpu(le64 const &d) { return le64toh(d.v_); } template <> inline le64 to_disk(uint64_t const &v) { return le64(htole64(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