From ec355c48c49074bebeb597f6e5dcedfeb9d52fae Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 9 Dec 2010 10:36:15 +0200 Subject: Add lazy pointer support Built-in support is provided for raw, auto, and tr1 shared/weak pointers. New test: common/lazy-ptr. --- odb/lazy-ptr-impl.hxx | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 odb/lazy-ptr-impl.hxx (limited to 'odb/lazy-ptr-impl.hxx') diff --git a/odb/lazy-ptr-impl.hxx b/odb/lazy-ptr-impl.hxx new file mode 100644 index 0000000..b480da5 --- /dev/null +++ b/odb/lazy-ptr-impl.hxx @@ -0,0 +1,149 @@ +// file : odb/lazy-ptr-impl.hxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_LAZY_PTR_IMPL_HXX +#define ODB_LAZY_PTR_IMPL_HXX + +#include + +#include // odb::database +#include + +#include + +namespace odb +{ + struct LIBODB_EXPORT lazy_ptr_impl_ref + { + void* id_; + database* db_; + void (*free_) (void*); + void* (*copy_) (const void*); + }; + + class LIBODB_EXPORT lazy_ptr_base + { + public: + typedef odb::database database_type; + + ~lazy_ptr_base (); + lazy_ptr_base (); + lazy_ptr_base (const lazy_ptr_base&); + lazy_ptr_base (const lazy_ptr_impl_ref&); + + lazy_ptr_base& + operator= (const lazy_ptr_base&); + + lazy_ptr_base& + operator= (const lazy_ptr_impl_ref&); + + // Reset both the id and database. + // + void + reset (); + + // Reset the id and set the database to the new value. + // + void + reset (database_type&); + + // Reset the id. + // + void + reset_id (); + + void + swap (lazy_ptr_base&); + + database_type* + database () const; + + typedef void* lazy_ptr_base::*unspecified_bool_type; + operator unspecified_bool_type () const + { + return id_ != 0 ? &lazy_ptr_base::id_ : 0; + } + + operator lazy_ptr_impl_ref (); + + protected: + typedef void (*free_func) (void*); + typedef void* (*copy_func) (const void*); + + // Makes a copy of id. + // + void + reset_ (database_type*, const void* id, free_func, copy_func); + + template + static void + free (void*); + + template + static void* + copy (const void*); + + protected: + void* id_; + database_type* db_; + + private: + free_func free_; + copy_func copy_; + }; + + template + class lazy_ptr_impl: public lazy_ptr_base + { + public: + lazy_ptr_impl (); + + template + lazy_ptr_impl (database_type&, const ID&); + + lazy_ptr_impl (const lazy_ptr_impl&); + + template + lazy_ptr_impl (const lazy_ptr_impl&); + + lazy_ptr_impl (const lazy_ptr_impl_ref&); + + lazy_ptr_impl& + operator= (const lazy_ptr_impl&); + + template + lazy_ptr_impl& + operator= (const lazy_ptr_impl&); + + lazy_ptr_impl& + operator= (const lazy_ptr_impl_ref&); + + using lazy_ptr_base::reset; + using lazy_ptr_base::reset_id; + + template + void + reset (database_type&, const ID&); + + template + void + reset_id (const ID&); + + template + typename object_traits::pointer_type + load (bool reset_id); + + template + typename object_traits::id_type + object_id () const; + }; +} + +#include +#include + +#include + +#endif // ODB_LAZY_PTR_IMPL_HXX -- cgit v1.1