aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConstantin Michael <constantin@codesynthesis.com>2011-05-26 16:27:43 +0200
committerConstantin Michael <constantin@codesynthesis.com>2011-05-26 16:27:43 +0200
commit3f94b73f025f2fa3e08edf07270225c4a5c391c1 (patch)
tree0ef3b1e39bf2d25aebf54c8ce6ccc58e49754151
parentd898c4df75e10a6aa0704ffd9952da73ee7d4060 (diff)
Add host endian detection and endian conversion algorithms
-rw-r--r--odb/pgsql/endian-traits.cxx29
-rw-r--r--odb/pgsql/endian-traits.hxx109
-rw-r--r--odb/pgsql/makefile1
3 files changed, 139 insertions, 0 deletions
diff --git a/odb/pgsql/endian-traits.cxx b/odb/pgsql/endian-traits.cxx
new file mode 100644
index 0000000..6730912
--- /dev/null
+++ b/odb/pgsql/endian-traits.cxx
@@ -0,0 +1,29 @@
+// file : odb/pgsql/endian-traits.cxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <odb/pgsql/endian-traits.hxx>
+
+namespace odb
+{
+ namespace pgsql
+ {
+ namespace
+ {
+ endian_traits::endian
+ infer_host_endian ()
+ {
+ short s (1);
+ char* c (reinterpret_cast<char*> (&s));
+
+ return *c == 0 ?
+ endian_traits::big_endian :
+ endian_traits::little_endian;
+ }
+ }
+
+ const endian_traits::endian endian_traits::host_endian (
+ infer_host_endian ());
+ }
+}
diff --git a/odb/pgsql/endian-traits.hxx b/odb/pgsql/endian-traits.hxx
new file mode 100644
index 0000000..07dc023
--- /dev/null
+++ b/odb/pgsql/endian-traits.hxx
@@ -0,0 +1,109 @@
+// file : odb/pgsql/endian-traits.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_PGSQL_ENDIAN_TRAITS_HXX
+#define ODB_PGSQL_ENDIAN_TRAITS_HXX
+
+#include <algorithm> // std::reverse
+
+namespace odb
+{
+ namespace pgsql
+ {
+ template <typename T, int S = sizeof (T)>
+ struct swap_endian;
+
+ template <typename T>
+ struct swap_endian<T, 2>
+ {
+ static T
+ swap (T x)
+ {
+ union u2
+ {
+ T t;
+ char c[2];
+ };
+
+ u2 u;
+ u.t = x;
+ std::reverse (u.c, u.c + 2);
+
+ return u.t;
+ }
+ };
+
+ template <typename T>
+ struct swap_endian<T, 4>
+ {
+ static T
+ swap (T x)
+ {
+ union u4
+ {
+ T t;
+ char c[4];
+ };
+
+ u4 u;
+ u.t = x;
+ std::reverse (u.c, u.c + 4);
+
+ return u.t;
+ }
+ };
+
+ template <typename T>
+ struct swap_endian<T, 8>
+ {
+ static T
+ swap (T x)
+ {
+ union u8
+ {
+ T t;
+ char c[8];
+ };
+
+ u8 u;
+ u.t = x;
+ std::reverse (u.c, u.c + 8);
+
+ return u.t;
+ }
+ };
+
+ class endian_traits
+ {
+ public:
+ enum endian
+ {
+ big_endian,
+ little_endian
+ };
+
+ public:
+ static const endian host_endian;
+
+ public:
+
+ template <typename T>
+ static T
+ hton (T x)
+ {
+ return host_endian == big_endian ? x : swap_endian<T>::swap (x);
+ }
+
+ template <typename T>
+ static T
+ ntoh (T x)
+ {
+ return host_endian == big_endian ? x : swap_endian<T>::swap (x);
+ }
+ };
+ }
+}
+
+#endif // ODB_PGSQL_ENDIAN_TRAITS_HXX
diff --git a/odb/pgsql/makefile b/odb/pgsql/makefile
index 164ebac..e448f6e 100644
--- a/odb/pgsql/makefile
+++ b/odb/pgsql/makefile
@@ -10,6 +10,7 @@ cxx := \
connection.cxx \
connection-factory.cxx \
database.cxx \
+endian-traits.cxx \
error.cxx \
exceptions.cxx \
statement.cxx \