diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-15 17:46:28 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-15 17:46:28 +0200 |
commit | 30b664c0561cc9f6d2bd24f7bce9b6c57fb52320 (patch) | |
tree | 743ce4a41249c8586e81a001cf147bedfbdf9a85 /odb/result.hxx | |
parent | 93392ca601a0cab8517a4ca8d163df4b41dd3e49 (diff) |
Add support for custom object pointers
New option: --default-pointer. New object pragma specifier: pointer.
Diffstat (limited to 'odb/result.hxx')
-rw-r--r-- | odb/result.hxx | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/odb/result.hxx b/odb/result.hxx index ff9f057..cf924c3 100644 --- a/odb/result.hxx +++ b/odb/result.hxx @@ -40,8 +40,19 @@ namespace odb typedef typename traits::pointer_type pointer_type; typedef typename traits::pointer_traits pointer_traits; - pointer_type - current (bool release); + // To make this work with all kinds of pointers (naked, std::auto_ptr, + // shared), we need to make sure we don't make any copies of the + // pointer on the return path. + // + pointer_type& + current (); + + void + release () + { + current_ = pointer_type (); + guard_.release (); + } bool end () const @@ -100,7 +111,7 @@ namespace odb reference operator* () const { - return pointer_traits::get_ref (res_->current (false)); + return pointer_traits::get_ref (res_->current ()); } // Our value_type is already a pointer so return it instead of @@ -110,7 +121,7 @@ namespace odb pointer operator-> () const { - return pointer_traits::get_ptr (res_->current (false)); + return pointer_traits::get_ptr (res_->current ()); } result_iterator& @@ -133,7 +144,9 @@ namespace odb typename object_traits<T>::pointer_type load () { - return res_->current (true); + typename object_traits<T>::pointer_type r (res_->current ()); + res_->release (); + return r; } void |