From 64cfe5e150e2d3e58dde1a6701d8c734c20e0848 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 2 Mar 2012 14:11:03 +0200 Subject: 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. --- odb/details/config-vc.h | 8 ++--- odb/details/config.h.in | 2 -- odb/details/config.hxx | 3 +- odb/details/unique-ptr.hxx | 80 ++++++++++++++++++++++++++++++++++++++++++++++ odb/makefile | 7 ---- 5 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 odb/details/unique-ptr.hxx (limited to 'odb') 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 -# 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 + +namespace odb +{ + namespace details + { + template + 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 + inline bool + operator== (const unique_ptr& a, const unique_ptr& b) + { + return a.get () == b.get (); + } + + template + inline bool + operator!= (const unique_ptr& a, const unique_ptr& b) + { + return a.get () != b.get (); + } + } +} + +#include + +#endif // ODB_DETAILS_UNIQUE_PTR_HXX diff --git a/odb/makefile b/odb/makefile index 26820d2..fd61513 100644 --- a/odb/makefile +++ b/odb/makefile @@ -79,10 +79,7 @@ endif $(cxx_obj) $(cxx_od): $(odb.l.cpp-options) $(out_base)/details/config.h $(odb.l.cpp-options): value := -I$(out_root) -I$(src_root) -$(call include,$(bld_root)/cxx/standard.make) # cxx_standard - ifdef libodb_threads -ifdef cxx_standard $(out_base)/details/config.h: | $(out_base)/details/. @echo '/* file : odb/details/config.h' >$@ @echo ' * note : automatically generated' >>$@ @@ -100,13 +97,9 @@ endif ifeq ($(libodb_threads),none) @echo '#define ODB_THREADS_NONE 1' >>$@ endif -ifeq ($(cxx_standard),c++11) - @echo '#define ODB_CXX11 1' >>$@ -endif @echo '' >>$@ @echo '#endif /* ODB_DETAILS_CONFIG_H */' >>$@ endif -endif $(call include-dep,$(cxx_od),$(cxx_obj),$(out_base)/details/config.h) -- cgit v1.1