5 #ifndef ODB_LAZY_PTR_HXX
6 #define ODB_LAZY_PTR_HXX
16 #include <odb/details/config.hxx>
42 template <
class Y>
void reset (Y*);
51 return (p_ || i_) ? &lazy_ptr::p_ : 0;
80 template <
class DB,
class ID>
lazy_ptr (DB&,
const ID&);
81 template <
class DB,
class Y>
lazy_ptr (DB&, Y*);
83 template <
class DB,
class ID>
void reset (DB&,
const ID&);
84 template <
class DB,
class Y>
void reset (DB&, Y*);
86 #ifdef ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
87 template <
class O = T>
109 template <
class T,
class Y>
112 template <
class T,
class Y>
160 return (p_.get () != 0 || i_) ? &lazy_auto_ptr::p_ : 0;
186 std::auto_ptr<T>&
load ()
const;
198 template <
class DB,
class ID>
lazy_auto_ptr (DB&,
const ID&);
200 template <
class DB,
class Y>
lazy_auto_ptr (DB&, std::auto_ptr<Y>&);
202 template <
class DB,
class ID>
void reset (DB&,
const ID&);
203 template <
class DB>
void reset (DB&, T*);
204 template <
class DB,
class Y>
void reset (DB&, std::auto_ptr<Y>&);
206 #ifdef ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
207 template <
class O = T>
223 mutable std::auto_ptr<T> p_;
231 template <
class T,
class D = std::default_delete<T>>
232 class lazy_unique_ptr
238 typedef T element_type;
239 typedef D deleter_type;
242 #ifdef ODB_CXX11_NULLPTR
243 lazy_unique_ptr (std::nullptr_t) ;
245 explicit lazy_unique_ptr (pointer) ;
249 lazy_unique_ptr (pointer,
const deleter_type&) ;
250 lazy_unique_ptr (pointer, deleter_type&&) ;
252 lazy_unique_ptr (lazy_unique_ptr&&) ;
253 template <
class T1,
class D1> lazy_unique_ptr (lazy_unique_ptr<T1, D1>&&) ;
254 template <
class T1> lazy_unique_ptr (std::auto_ptr<T1>&&) ;
256 #ifdef ODB_CXX11_NULLPTR
257 lazy_unique_ptr& operator= (std::nullptr_t) ;
259 lazy_unique_ptr& operator= (lazy_unique_ptr&&) ;
260 template <
class T1,
class D1> lazy_unique_ptr& operator= (lazy_unique_ptr<T1, D1>&&) ;
262 T& operator* ()
const;
263 pointer operator-> () const ;
264 pointer get () const ;
265 #ifdef ODB_CXX11_EXPLICIT_CONVERSION_OPERATOR
266 explicit operator bool() const ;
268 typedef std::unique_ptr<T, D> lazy_unique_ptr::*unspecified_bool_type;
269 operator unspecified_bool_type ()
const
271 return (p_ || i_) ? &lazy_unique_ptr::p_ : 0;
276 void reset (pointer = pointer ()) ;
277 void swap (lazy_unique_ptr&) ;
282 #ifdef ODB_CXX11_DELETED_FUNCTION
283 lazy_unique_ptr (
const lazy_unique_ptr&) =
delete;
284 lazy_unique_ptr& operator= (
const lazy_unique_ptr&) =
delete;
287 lazy_unique_ptr (
const lazy_unique_ptr&);
288 lazy_unique_ptr& operator= (
const lazy_unique_ptr&);
294 template <
class T1,
class D1> lazy_unique_ptr (std::unique_ptr<T1, D1>&&) ;
295 template <
class T1,
class D1> lazy_unique_ptr& operator= (std::unique_ptr<T1, D1>&&) ;
309 bool loaded ()
const;
311 std::unique_ptr<T, D>& load ()
const;
316 void unload ()
const;
321 std::unique_ptr<T, D>& get_eager ()
const;
323 template <
class DB,
class ID> lazy_unique_ptr (DB&,
const ID&);
324 template <
class DB> lazy_unique_ptr (DB&, pointer);
325 template <
class DB> lazy_unique_ptr (DB&, pointer,
const deleter_type&);
326 template <
class DB> lazy_unique_ptr (DB&, pointer, deleter_type&&);
327 template <
class DB,
class T1,
class D1> lazy_unique_ptr (DB&, std::unique_ptr<T1, D1>&&);
328 template <
class DB,
class T1> lazy_unique_ptr (DB&, std::auto_ptr<T1>&&);
330 template <
class DB,
class ID>
void reset (DB&,
const ID&);
331 template <
class DB>
void reset (DB&, pointer);
332 template <
class DB,
class T1,
class D1>
void reset (DB&, std::unique_ptr<T1, D1>&&);
333 template <
class DB,
class T1>
void reset (DB&, std::auto_ptr<T1>&&);
335 #ifdef ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
336 template <
class O = T>
340 typename object_traits<O>::id_type object_id ()
const;
342 database_type& database ()
const;
347 template <
class T1,
class D1>
bool equal (
const lazy_unique_ptr<T1, D1>&)
const;
350 template <
class T1,
class D1>
friend class lazy_unique_ptr;
357 mutable std::unique_ptr<T, D> p_;
358 mutable lazy_ptr_impl<T> i_;
361 template <
class T>
void swap (lazy_unique_ptr<T>&, lazy_unique_ptr<T>&) ;
365 template <
class T1,
class D1,
class T2,
class D2>
366 bool operator== (
const lazy_unique_ptr<T1, D1>&,
const lazy_unique_ptr<T2, D2>&);
368 template <
class T1,
class D1,
class T2,
class D2>
369 bool operator!= (
const lazy_unique_ptr<T1, D1>&,
const lazy_unique_ptr<T2, D2>&);
371 #ifdef ODB_CXX11_NULLPTR
372 template <
class T,
class D>
373 bool operator== (
const lazy_unique_ptr<T, D>&, std::nullptr_t) ;
375 template <
class T,
class D>
376 bool operator== (std::nullptr_t,
const lazy_unique_ptr<T, D>&) ;
378 template <
class T,
class D>
379 bool operator!= (
const lazy_unique_ptr<T, D>&, std::nullptr_t) ;
381 template <
class T,
class D>
382 bool operator!= (std::nullptr_t,
const lazy_unique_ptr<T, D>&) ;
391 class lazy_shared_ptr
396 typedef T element_type;
399 #ifdef ODB_CXX11_NULLPTR
400 lazy_shared_ptr (std::nullptr_t) ;
402 template <
class Y>
explicit lazy_shared_ptr (Y*);
403 template <
class Y,
class D> lazy_shared_ptr (Y*, D);
404 template <
class Y,
class D,
class A> lazy_shared_ptr (Y*, D, A);
405 #ifdef ODB_CXX11_NULLPTR
406 template <
class D> lazy_shared_ptr (std::nullptr_t, D);
407 template <
class D,
class A> lazy_shared_ptr (std::nullptr_t, D, A);
409 template <
class Y> lazy_shared_ptr (
const lazy_shared_ptr<Y>&, T*) ;
411 lazy_shared_ptr (
const lazy_shared_ptr&) ;
412 template <
class Y> lazy_shared_ptr (
const lazy_shared_ptr<Y>&) ;
413 lazy_shared_ptr (lazy_shared_ptr&&) ;
414 template <
class Y> lazy_shared_ptr (lazy_shared_ptr<Y>&&) ;
415 template <
class Y>
explicit lazy_shared_ptr (
const lazy_weak_ptr<Y>&);
416 template <
class Y>
explicit lazy_shared_ptr (std::auto_ptr<Y>&&);
417 template <
class Y,
class D> lazy_shared_ptr (std::unique_ptr<Y, D>&&);
421 lazy_shared_ptr& operator= (
const lazy_shared_ptr&) ;
422 template <
class Y> lazy_shared_ptr& operator= (
const lazy_shared_ptr<Y>&) ;
423 lazy_shared_ptr& operator= (lazy_shared_ptr&&) ;
424 template <
class Y> lazy_shared_ptr& operator= (lazy_shared_ptr<Y>&&) ;
425 template <
class Y> lazy_shared_ptr& operator= (std::auto_ptr<Y>&&);
426 template <
class Y,
class D> lazy_shared_ptr& operator= (std::unique_ptr<Y, D>&&);
428 void swap (lazy_shared_ptr&) ;
430 template <
class Y>
void reset (Y*);
431 template <
class Y,
class D>
void reset (Y*, D);
432 template <
class Y,
class D,
class A>
void reset (Y*, D, A);
435 T& operator* () const ;
436 T* operator-> () const ;
437 long use_count () const ;
438 bool unique () const ;
439 #ifdef ODB_CXX11_EXPLICIT_CONVERSION_OPERATOR
440 explicit operator bool () const ;
442 typedef std::shared_ptr<T> lazy_shared_ptr::*unspecified_bool_type;
443 operator unspecified_bool_type ()
const
445 return (p_ || i_) ? &lazy_shared_ptr::p_ : 0;
454 template <
class Y> lazy_shared_ptr (
const std::shared_ptr<Y>&);
455 template <
class Y> lazy_shared_ptr (std::shared_ptr<Y>&&);
456 template <
class Y>
explicit lazy_shared_ptr (
const std::weak_ptr<Y>&);
458 template <
class Y> lazy_shared_ptr& operator= (
const std::shared_ptr<Y>&);
459 template <
class Y> lazy_shared_ptr& operator= (std::shared_ptr<Y>&&);
473 bool loaded ()
const;
475 std::shared_ptr<T> load ()
const;
480 void unload ()
const;
485 std::shared_ptr<T> get_eager ()
const;
487 template <
class DB,
class ID> lazy_shared_ptr (DB&,
const ID&);
488 template <
class DB,
class Y> lazy_shared_ptr (DB&, Y*);
489 template <
class DB,
class Y,
class D> lazy_shared_ptr (DB&, Y*, D);
490 template <
class DB,
class Y,
class D,
class A> lazy_shared_ptr (DB&, Y*, D, A);
491 template <
class DB,
class Y> lazy_shared_ptr (DB&, std::auto_ptr<Y>&&);
492 template <
class DB,
class Y> lazy_shared_ptr (DB&,
const std::shared_ptr<Y>&);
493 template <
class DB,
class Y> lazy_shared_ptr (DB&, std::shared_ptr<Y>&&);
494 template <
class DB,
class Y> lazy_shared_ptr (DB&,
const std::weak_ptr<Y>&);
496 template <
class DB,
class ID>
void reset (DB&,
const ID&);
497 template <
class DB,
class Y>
void reset (DB&, Y*);
498 template <
class DB,
class Y,
class D>
void reset (DB&, Y*, D);
499 template <
class DB,
class Y,
class D,
class A>
void reset (DB&, Y*, D, A);
500 template <
class DB,
class Y>
void reset (DB&, std::auto_ptr<Y>&&);
501 template <
class DB,
class Y>
void reset (DB&,
const std::shared_ptr<Y>&);
502 template <
class DB,
class Y>
void reset (DB&, std::shared_ptr<Y>&&);
504 #ifdef ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
505 template <
class O = T>
509 typename object_traits<O>::id_type object_id ()
const;
511 database_type& database ()
const;
516 template <
class Y>
bool equal (
const lazy_shared_ptr<Y>&)
const;
519 template <
class Y>
friend class lazy_shared_ptr;
520 template <
class Y>
friend class lazy_weak_ptr;
522 mutable std::shared_ptr<T> p_;
523 mutable lazy_ptr_impl<T> i_;
526 template <
class T>
void swap (lazy_shared_ptr<T>&, lazy_shared_ptr<T>&) ;
528 template <
class D,
class T>
533 template <
class T,
class Y>
534 bool operator== (
const lazy_shared_ptr<T>&,
const lazy_shared_ptr<Y>&) ;
536 template <
class T,
class Y>
537 bool operator!= (
const lazy_shared_ptr<T>&,
const lazy_shared_ptr<Y>&) ;
539 #ifdef ODB_CXX11_NULLPTR
541 bool operator== (
const lazy_shared_ptr<T>&, std::nullptr_t) ;
544 bool operator== (std::nullptr_t,
const lazy_shared_ptr<T>&) ;
547 bool operator!= (
const lazy_shared_ptr<T>&, std::nullptr_t) ;
550 bool operator!= (std::nullptr_t,
const lazy_shared_ptr<T>&) ;
561 typedef T element_type;
564 template <
class Y> lazy_weak_ptr (
const lazy_shared_ptr<Y>&) ;
565 lazy_weak_ptr (
const lazy_weak_ptr&) ;
566 template <
class Y> lazy_weak_ptr (
const lazy_weak_ptr<Y>&) ;
570 lazy_weak_ptr& operator= (
const lazy_weak_ptr&) ;
571 template <
class Y> lazy_weak_ptr& operator= (
const lazy_weak_ptr<Y>&) ;
572 template <
class Y> lazy_weak_ptr& operator= (
const lazy_shared_ptr<Y>&) ;
574 void swap (lazy_weak_ptr<T>&) ;
577 long use_count () const ;
578 bool expired () const ;
580 lazy_shared_ptr<T> lock () const ;
587 template <class Y> lazy_weak_ptr (const std::weak_ptr<Y>&);
588 template <class Y> lazy_weak_ptr (const std::shared_ptr<Y>&);
590 template <class Y> lazy_weak_ptr& operator= (const std::weak_ptr<Y>&);
591 template <class Y> lazy_weak_ptr& operator= (const std::shared_ptr<Y>&);
596 typedef odb::database database_type;
605 bool loaded () const;
609 std::shared_ptr<T> load () const;
614 void unload () const;
619 std::weak_ptr<T> get_eager () const;
621 template <class DB, class ID> lazy_weak_ptr (DB&, const ID&);
622 template <class DB, class Y> lazy_weak_ptr (DB&, const std::shared_ptr<Y>&);
623 template <class DB, class Y> lazy_weak_ptr (DB&, const std::weak_ptr<Y>&);
625 template <class DB, class ID>
void reset (DB&, const ID&);
626 template <class DB, class Y>
void reset (DB&, const std::shared_ptr<Y>&);
627 template <class DB, class Y>
void reset (DB&, const std::weak_ptr<Y>&);
632 #ifdef ODB_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGUMENT
633 template <
class O = T>
637 typename object_traits<O>::id_type object_id ()
const;
639 database_type& database ()
const;
642 template <
class Y>
friend class lazy_shared_ptr;
643 template <
class Y>
friend class lazy_weak_ptr;
645 mutable std::weak_ptr<T> p_;
646 mutable lazy_ptr_impl<T> i_;
651 template <
class T>
void swap (lazy_weak_ptr<T>&, lazy_weak_ptr<T>&);
661 using odb::lazy_unique_ptr;
662 using odb::lazy_shared_ptr;
663 using odb::lazy_weak_ptr;
668 #include <odb/lazy-ptr.ixx>
669 #include <odb/lazy-ptr.txx>
675 #endif // ODB_LAZY_PTR_HXX
Definition: lazy-ptr.hxx:23
std::auto_ptr< T > & load() const
Definition: lazy-ptr-impl.hxx:115
object_traits< O >::id_type object_id() const
T *lazy_ptr::* unspecified_bool_type
Definition: lazy-ptr.hxx:48
odb::database database_type
Definition: lazy-ptr.hxx:175
std::auto_ptr< T > & get_eager() const
lazy_auto_ptr & operator=(lazy_auto_ptr &)
T * p_
Definition: lazy-ptr.hxx:124
database_type & database() const
Definition: forward.hxx:123
lazy_ptr & operator=(const lazy_ptr &)
Definition: lazy-ptr.hxx:120
T element_type
Definition: lazy-ptr.hxx:28
lazy_ptr_impl_ref i_
Definition: lazy-ptr.hxx:125
bool operator!=(const lazy_ptr< T > &, const lazy_ptr< Y > &)
friend class lazy_auto_ptr
Definition: lazy-ptr.hxx:216
std::auto_ptr< T > lazy_auto_ptr::* unspecified_bool_type
Definition: lazy-ptr.hxx:157
bool equal(const lazy_ptr< Y > &) const
Definition: lazy-ptr-impl.hxx:20
Definition: database.hxx:38
Definition: lazy-ptr.hxx:129
lazy_auto_ptr_ref(T *, const lazy_ptr_impl_ref &)
odb::database database_type
Definition: lazy-ptr.hxx:57
void swap(lazy_ptr< T > &, lazy_ptr< T > &)
D * get_deleter(const lazy_shared_ptr< T > &)
T element_type
Definition: lazy-ptr.hxx:134
bool operator==(const lazy_ptr< T > &, const lazy_ptr< Y > &)
object_traits< O >::id_type object_id() const
database_type & database() const