aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-02-29 11:53:22 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-02-29 11:53:22 +0200
commit650bcfa07b968118c7f77a5408ec504e42c5d8a3 (patch)
tree224f903b6e791874c01ea73e0532b649cac4f8da
parent40466e02c3ab7ef31183158103e3ef7536248753 (diff)
Support for C++11 std::unique_ptr and std::shared_ptr as wrappers
-rw-r--r--odb/wrapper-traits.hxx101
1 files changed, 100 insertions, 1 deletions
diff --git a/odb/wrapper-traits.hxx b/odb/wrapper-traits.hxx
index 35dec0e..8816f5a 100644
--- a/odb/wrapper-traits.hxx
+++ b/odb/wrapper-traits.hxx
@@ -7,10 +7,11 @@
#include <odb/pre.hxx>
-#include <memory> // std::auto_ptr
+#include <memory> // std::auto_ptr, std::unique_ptr, std::shared_ptr/weak_ptr
#include <odb/nullable.hxx>
+#include <odb/details/config.hxx> // ODB_CXX11
#include <odb/details/meta/remove-const.hxx>
namespace odb
@@ -122,6 +123,104 @@ namespace odb
}
};
+#ifdef ODB_CXX11
+
+ // Specialization for C++11 std::unique_ptr.
+ //
+ template <typename T, typename D>
+ class wrapper_traits<std::unique_ptr<T, D>>
+ {
+ public:
+ // T can be const.
+ //
+ typedef T wrapped_type;
+ typedef std::unique_ptr<T, D> wrapper_type;
+
+ // T can be const.
+ //
+ typedef
+ typename odb::details::meta::remove_const<T>::result
+ unrestricted_wrapped_type;
+
+ static const bool null_handler = true;
+ static const bool null_default = false;
+
+ static bool
+ get_null (const wrapper_type& p)
+ {
+ return !p;
+ }
+
+ static void
+ set_null (wrapper_type& p)
+ {
+ p.reset ();
+ }
+
+ static const wrapped_type&
+ get_ref (const wrapper_type& p)
+ {
+ return *p;
+ }
+
+ static unrestricted_wrapped_type&
+ set_ref (wrapper_type& p)
+ {
+ if (!p)
+ p.reset (new unrestricted_wrapped_type ());
+
+ return const_cast<unrestricted_wrapped_type&> (*p);
+ }
+ };
+
+ // Specialization for C++11 std::shared_ptr.
+ //
+ template <typename T>
+ class wrapper_traits<std::shared_ptr<T>>
+ {
+ public:
+ typedef T wrapped_type;
+ typedef std::shared_ptr<T> wrapper_type;
+
+ // T can be const.
+ //
+ typedef
+ typename odb::details::meta::remove_const<T>::result
+ unrestricted_wrapped_type;
+
+ static const bool null_handler = true;
+ static const bool null_default = false;
+
+ static bool
+ get_null (const wrapper_type& p)
+ {
+ return !p;
+ }
+
+ static void
+ set_null (wrapper_type& p)
+ {
+ p.reset ();
+ }
+
+ static const wrapped_type&
+ get_ref (const wrapper_type& p)
+ {
+ return *p;
+ }
+
+ static unrestricted_wrapped_type&
+ set_ref (wrapper_type& p)
+ {
+ if (!p)
+ p.reset (new unrestricted_wrapped_type);
+
+ return const_cast<unrestricted_wrapped_type&> (*p);
+ }
+ };
+
+#endif // ODB_CXX11
+
// Specialization for odb::nullable.
//
template <typename T>