From 43b3c92c5dae2d851f45fbe04f1c9ac6d9a933f4 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 28 Feb 2012 16:11:51 +0200 Subject: Add support for object pointers with two template parameters Such as C++11 std::unique_ptr. --- odb/database.hxx | 32 ++++++++++++++++++++++ odb/database.ixx | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ odb/traits.hxx | 12 ++++++++ 3 files changed, 127 insertions(+) diff --git a/odb/database.hxx b/odb/database.hxx index b7e7926..64f9d44 100644 --- a/odb/database.hxx +++ b/odb/database.hxx @@ -47,10 +47,18 @@ namespace odb typename object_traits::id_type persist (const P& obj_ptr); + template class P> + typename object_traits::id_type + persist (const P& obj_ptr); + template class P> typename object_traits::id_type persist (P& obj_ptr); + template class P> + typename object_traits::id_type + persist (P& obj_ptr); + template typename object_traits::id_type persist (const typename object_traits::pointer_type& obj_ptr); @@ -77,10 +85,18 @@ namespace odb void reload (const P& obj_ptr); + template class P> + void + reload (const P& obj_ptr); + template class P> void reload (P& obj_ptr); + template class P> + void + reload (P& obj_ptr); + template void reload (const typename object_traits::pointer_type& obj_ptr); @@ -109,10 +125,18 @@ namespace odb void update (const P& obj_ptr); + template class P> + void + update (const P& obj_ptr); + template class P> void update (P& obj_ptr); + template class P> + void + update (P& obj_ptr); + template void update (const typename object_traits::pointer_type& obj_ptr); @@ -136,10 +160,18 @@ namespace odb void erase (const P& obj_ptr); + template class P> + void + erase (const P& obj_ptr); + template class P> void erase (P& obj_ptr); + template class P> + void + erase (P& obj_ptr); + template void erase (const typename object_traits::pointer_type& obj_ptr); diff --git a/odb/database.ixx b/odb/database.ixx index 36766e2..d4869c1 100644 --- a/odb/database.ixx +++ b/odb/database.ixx @@ -66,6 +66,21 @@ namespace odb return persist_ (pobj); } + template class P> + inline typename object_traits::id_type database:: + persist (const P& p) + { + typedef typename object_traits::pointer_type object_pointer; + + // The passed pointer should be the same or implicit-convertible + // to the object pointer. This way we make sure the object pointer + // does not assume ownership of the passed object. + // + const object_pointer& pobj (p); + + return persist_ (pobj); + } + template class P> inline typename object_traits::id_type database:: persist (P& p) @@ -74,6 +89,14 @@ namespace odb return persist (cr); } + template class P> + inline typename object_traits::id_type database:: + persist (P& p) + { + const P& cr (p); + return persist (cr); + } + template inline typename object_traits::id_type database:: persist (const typename object_traits::pointer_type& pobj) @@ -95,6 +118,13 @@ namespace odb reload (odb::pointer_traits< P >::get_ref (p)); } + template class P> + inline void database:: + reload (const P& p) + { + reload (odb::pointer_traits< P >::get_ref (p)); + } + template class P> inline void database:: reload (P& p) @@ -102,6 +132,13 @@ namespace odb reload (odb::pointer_traits< P >::get_ref (p)); } + template class P> + inline void database:: + reload (P& p) + { + reload (odb::pointer_traits< P >::get_ref (p)); + } + template inline void database:: reload (const typename object_traits::pointer_type& pobj) @@ -141,6 +178,21 @@ namespace odb update_ (pobj); } + template class P> + inline void database:: + update (const P& p) + { + typedef typename object_traits::pointer_type object_pointer; + + // The passed pointer should be the same or implicit-convertible + // to the object pointer. This way we make sure the object pointer + // does not assume ownership of the passed object. + // + const object_pointer& pobj (p); + + update_ (pobj); + } + template class P> inline void database:: update (P& p) @@ -149,6 +201,14 @@ namespace odb update (cr); } + template class P> + inline void database:: + update (P& p) + { + const P& cr (p); + update (cr); + } + template inline void database:: update (const typename object_traits::pointer_type& pobj) @@ -186,6 +246,21 @@ namespace odb erase_ (pobj); } + template class P> + inline void database:: + erase (const P& p) + { + typedef typename object_traits::pointer_type object_pointer; + + // The passed pointer should be the same or implicit-convertible + // to the object pointer. This way we make sure the object pointer + // does not assume ownership of the passed object. + // + const object_pointer& pobj (p); + + erase_ (pobj); + } + template class P> inline void database:: erase (P& p) @@ -194,6 +269,14 @@ namespace odb erase (cr); } + template class P> + inline void database:: + erase (P& p) + { + const P& cr (p); + erase (cr); + } + template inline void database:: erase (const typename object_traits::pointer_type& pobj) diff --git a/odb/traits.hxx b/odb/traits.hxx index 9445c7a..4c71f94 100644 --- a/odb/traits.hxx +++ b/odb/traits.hxx @@ -163,12 +163,24 @@ namespace odb struct id_type {}; }; + template class P> + struct object_traits< P > + { + struct id_type {}; + }; + template class P> struct object_traits< const P > { struct id_type {}; }; + template class P> + struct object_traits< const P > + { + struct id_type {}; + }; + // // view_traits // -- cgit v1.1