aboutsummaryrefslogtreecommitdiff
path: root/odb/details
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-03-02 14:11:03 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-03-02 14:11:03 +0200
commit64cfe5e150e2d3e58dde1a6701d8c734c20e0848 (patch)
tree600adad0eb7f41cd5e1a4e34a28922db4024684f /odb/details
parent8a9e1081c026a092c7dfb28fbd079b88850c7233 (diff)
Reimplement C++11 support to be header-only
This way, the same build of the runtime libraries can be used in both C++98 and C++11 modes. This is important for when runtimes are installed or packaged.
Diffstat (limited to 'odb/details')
-rw-r--r--odb/details/config-vc.h8
-rw-r--r--odb/details/config.h.in2
-rw-r--r--odb/details/config.hxx3
-rw-r--r--odb/details/unique-ptr.hxx80
4 files changed, 85 insertions, 8 deletions
diff --git a/odb/details/config-vc.h b/odb/details/config-vc.h
index 56d69e7..2c2990a 100644
--- a/odb/details/config-vc.h
+++ b/odb/details/config-vc.h
@@ -16,11 +16,9 @@
#if _MSC_VER >= 1600
# define ODB_CXX11
# define ODB_CXX11_NULLPTR
-# if _MSC_VER >= 1800
-# define ODB_CXX11_DELETED_FUNCTION
-# define ODB_CXX11_EXPLICIT_CONVERSION_OPERATOR
-# define ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
-# endif
+//# define ODB_CXX11_DELETED_FUNCTION
+//# define ODB_CXX11_EXPLICIT_CONVERSION_OPERATOR
+//# define ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
#endif
#endif /* ODB_DETAILS_CONFIG_VC_H */
diff --git a/odb/details/config.h.in b/odb/details/config.h.in
index 5e71765..2422d98 100644
--- a/odb/details/config.h.in
+++ b/odb/details/config.h.in
@@ -14,8 +14,6 @@
#undef ODB_THREADS_TLS_KEYWORD
#undef ODB_THREADS_TLS_DECLSPEC
-#undef ODB_CXX11
-
#undef LIBODB_STATIC_LIB
#endif /* ODB_DETAILS_CONFIG_H */
diff --git a/odb/details/config.hxx b/odb/details/config.hxx
index fc47ec7..36a8e3a 100644
--- a/odb/details/config.hxx
+++ b/odb/details/config.hxx
@@ -23,7 +23,8 @@
# endif
#else
# include <odb/details/config.h>
-# ifdef ODB_CXX11
+# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
+# define ODB_CXX11
# ifdef __GNUC__
# if __GNUC__ >= 4 && __GNUC_MINOR__ >= 6
# define ODB_CXX_NULLPTR
diff --git a/odb/details/unique-ptr.hxx b/odb/details/unique-ptr.hxx
new file mode 100644
index 0000000..ab08d51
--- /dev/null
+++ b/odb/details/unique-ptr.hxx
@@ -0,0 +1,80 @@
+// file : odb/details/unique-ptr.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_DETAILS_UNIQUE_PTR_HXX
+#define ODB_DETAILS_UNIQUE_PTR_HXX
+
+#include <odb/pre.hxx>
+
+namespace odb
+{
+ namespace details
+ {
+ template <typename T>
+ class unique_ptr
+ {
+ public:
+ typedef T element_type;
+
+ explicit unique_ptr (T* p = 0): p_ (p) {}
+ ~unique_ptr () {delete p_;}
+
+ private:
+ unique_ptr (const unique_ptr&);
+ unique_ptr& operator= (const unique_ptr&);
+
+ public:
+ T*
+ operator-> () const {return p_;}
+
+ T&
+ operator* () const {return *p_;}
+
+ typedef T* unique_ptr::*unspecified_bool_type;
+ operator unspecified_bool_type () const
+ {
+ return p_ != 0 ? &unique_ptr::p_ : 0;
+ }
+
+ T*
+ get () const {return p_;}
+
+ void
+ reset (T* p = 0)
+ {
+ delete p_;
+ p_ = p;
+ }
+
+ T*
+ release ()
+ {
+ T* r (p_);
+ p_ = 0;
+ return r;
+ }
+
+ private:
+ T* p_;
+ };
+
+ template <typename T1, typename T2>
+ inline bool
+ operator== (const unique_ptr<T1>& a, const unique_ptr<T2>& b)
+ {
+ return a.get () == b.get ();
+ }
+
+ template <typename T1, typename T2>
+ inline bool
+ operator!= (const unique_ptr<T1>& a, const unique_ptr<T2>& b)
+ {
+ return a.get () != b.get ();
+ }
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_DETAILS_UNIQUE_PTR_HXX