aboutsummaryrefslogtreecommitdiff
path: root/odb/result.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-11-15 17:46:28 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-11-15 17:46:28 +0200
commit30b664c0561cc9f6d2bd24f7bce9b6c57fb52320 (patch)
tree743ce4a41249c8586e81a001cf147bedfbdf9a85 /odb/result.hxx
parent93392ca601a0cab8517a4ca8d163df4b41dd3e49 (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.hxx23
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