00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SGE_ENDIANNESS_HPP_INCLUDED
00022 #define SGE_ENDIANNESS_HPP_INCLUDED
00023
00024 #include <cstddef>
00025 #include "export.hpp"
00026
00027 #if defined(SGE_LITTLE_ENDIAN) && defined(SGE_BIG_ENDIAN)
00028 #error "SGE_LITTLE_ENDIAN and SGE_BIG_ENDIAN defined!"
00029 #endif
00030
00031 namespace sge
00032 {
00033
00034 SGE_SYMBOL void swap_endianness(unsigned char*, std::size_t len);
00035
00036 SGE_SYMBOL void from_to_big_endianness(unsigned char*, std::size_t len);
00037
00038 SGE_SYMBOL void from_to_little_endianness(unsigned char*, std::size_t len);
00039
00040 template<typename T>
00041 T swap_endianness(T t)
00042 {
00043 swap_endianness(reinterpret_cast<unsigned char*>(&t), sizeof(T));
00044 return t;
00045 }
00046
00047 inline bool is_little_endian()
00048 {
00049 #if defined(SGE_LITTLE_ENDIAN)
00050 return true;
00051 #elif defined(SGE_BIG_ENDIAN)
00052 return false;
00053 #else
00054 typedef int type;
00055 union {
00056 type t;
00057 char c[sizeof(type)];
00058 } u;
00059 u.t = 1;
00060
00061 return u.c[0] == u.t;
00062 #endif
00063 }
00064
00065 template<typename T>
00066 inline T from_to_big_endianness(const T& t)
00067 {
00068 if(is_little_endian())
00069 return swap_endianness(t);
00070 return t;
00071 }
00072
00073 template<typename T>
00074 inline T from_to_little_endianness(const T& t)
00075 {
00076 if(!is_little_endian())
00077 return swap_endianness(t);
00078 return t;
00079 }
00080
00081 }
00082
00083 #endif