// file : odb/lazy-ptr.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_LAZY_PTR_HXX #define ODB_LAZY_PTR_HXX #include #include // std::auto_ptr #include // odb::database #include #include namespace odb { template class lazy_ptr { // Pointer interface. // public: typedef T element_type; lazy_ptr (); template lazy_ptr (Y*); lazy_ptr (const lazy_ptr&); template lazy_ptr (const lazy_ptr&); lazy_ptr& operator= (const lazy_ptr&); template lazy_ptr& operator= (Y*); template lazy_ptr& operator= (const lazy_ptr&); void swap (lazy_ptr&); void reset (); template void reset (Y*); T& operator* () const; T* operator-> () const; T* get () const; typedef T* lazy_ptr::*unspecified_bool_type; operator unspecified_bool_type () const { return (p_ || i_) ? &lazy_ptr::p_ : 0; } // Lazy loading interface. // public: typedef odb::database database_type; // NULL loaded() // // true true NULL pointer to transient object // false true valid pointer to persistent object // true false unloaded pointer to persistent object // false false valid pointer to transient object // bool loaded () const; T* load () const; // Unload the pointer. For transient objects this function is // equivalent to reset(). // void unload () const; template lazy_ptr (database_type&, const ID&); template lazy_ptr (database_type&, Y*); template void reset (database_type&, const ID&); template void reset (database_type&, Y*); template typename object_traits::id_type object_id () const; database_type& database () const; // Helpers. // public: template bool equal (const lazy_ptr&) const; private: template friend class lazy_ptr; mutable T* p_; mutable lazy_ptr_impl i_; }; // operator< and operator<< are not provided. // template bool operator== (const lazy_ptr&, const lazy_ptr&); template bool operator!= (const lazy_ptr&, const lazy_ptr&); template void swap (lazy_ptr&, lazy_ptr&); // // template struct lazy_auto_ptr_ref { explicit lazy_auto_ptr_ref (T*, const lazy_ptr_impl_ref&); T* p_; lazy_ptr_impl_ref i_; }; template class lazy_auto_ptr { // Standard auto_ptr interface. // public: typedef T element_type; explicit lazy_auto_ptr (T* = 0); lazy_auto_ptr (lazy_auto_ptr&); template lazy_auto_ptr (lazy_auto_ptr&); lazy_auto_ptr& operator= (lazy_auto_ptr&); template lazy_auto_ptr& operator= (lazy_auto_ptr&); T& operator* () const; T* operator-> () const; T* get () const; T* release (); void reset (T* = 0); lazy_auto_ptr (const lazy_auto_ptr_ref&); lazy_auto_ptr& operator= (const lazy_auto_ptr_ref&); template operator lazy_auto_ptr_ref (); template operator lazy_auto_ptr (); // Extension: conversion to bool. // public: typedef std::auto_ptr lazy_auto_ptr::*unspecified_bool_type; operator unspecified_bool_type () const { return (p_.get () != 0 || i_) ? &lazy_auto_ptr::p_ : 0; } // Initialization/assignment from auto_ptr. // public: template lazy_auto_ptr (std::auto_ptr&); lazy_auto_ptr (std::auto_ptr_ref); template lazy_auto_ptr& operator= (std::auto_ptr&); lazy_auto_ptr& operator= (std::auto_ptr_ref); // Lazy loading interface. // public: typedef odb::database database_type; // NULL loaded() // // true true NULL pointer to transient object // false true valid pointer to persistent object // true false unloaded pointer to persistent object // false false valid pointer to transient object // bool loaded () const; std::auto_ptr& load () const; // Unload the pointer. For transient objects this function is // equivalent to reset(). // void unload () const; template lazy_auto_ptr (database_type&, const ID&); lazy_auto_ptr (database_type&, T*); template lazy_auto_ptr (database_type&, std::auto_ptr&); template void reset (database_type&, const ID&); void reset (database_type&, T*); template void reset (database_type&, std::auto_ptr&); template typename object_traits::id_type object_id () const; database_type& database () const; private: template friend class lazy_auto_ptr; // Note that it is possible to have a situation where p_ is NULL, // i_.id is NULL and i_.db is not NULL. This will happen if the // auto_ptr reference returned by load() is transferred to another // pointer or reset. // mutable std::auto_ptr p_; mutable lazy_ptr_impl i_; }; namespace core { using odb::lazy_ptr; using odb::lazy_auto_ptr; } } #include #include #include #include #endif // ODB_LAZY_PTR_HXX