// file : odb/pgsql/details/endian-traits.hxx // copyright : Copyright (c) 2009-2015 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_PGSQL_DETAILS_ENDIAN_TRAITS_HXX #define ODB_PGSQL_DETAILS_ENDIAN_TRAITS_HXX #include // std::size_t #include // std::reverse #include namespace odb { // @@ Revise this. // namespace details { } namespace pgsql { namespace details { using namespace odb::details; template struct swap_endian; template struct swap_endian { static T swap (T x) { return x; } }; template struct swap_endian { static T swap (T x) { union u2 { T t; char c[2]; }; u2 u; u.t = x; char tmp (u.c[0]); u.c[0] = u.c[1]; u.c[1] = tmp; return u.t; } }; template struct swap_endian { static T swap (T x) { union u4 { T t; char c[4]; }; u4 u; u.t = x; char tmp (u.c[0]); u.c[0] = u.c[3]; u.c[3] = tmp; tmp = u.c[1]; u.c[1] = u.c[2]; u.c[2] = tmp; return u.t; } }; template struct swap_endian { static T swap (T x) { union u8 { T t; char c[8]; }; u8 u; u.t = x; char tmp (u.c[0]); u.c[0] = u.c[7]; u.c[7] = tmp; tmp = u.c[1]; u.c[1] = u.c[6]; u.c[6] = tmp; tmp = u.c[2]; u.c[2] = u.c[5]; u.c[5] = tmp; tmp = u.c[3]; u.c[3] = u.c[4]; u.c[4] = tmp; return u.t; } }; class LIBODB_PGSQL_EXPORT endian_traits { public: enum endian { big, little }; public: static const endian host_endian; public: template static T hton (T x) { return host_endian == big ? x : swap_endian::swap (x); } template static T ntoh (T x) { return host_endian == big ? x : swap_endian::swap (x); } }; } } } #endif // ODB_PGSQL_DETAILS_ENDIAN_TRAITS_HXX