// file : odb/traits.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file #ifndef ODB_TRAITS_HXX #define ODB_TRAITS_HXX #include #include #include namespace odb { // template // class access::object_traits; // // Specializations should inherit from object_memory, object_factory // and define the following members: // // id_type - object id (primary key) type // id_type id (const T&) - get object id // // void persist (database&, T&) // void update (database&, T&) // void erase (database&, const id_type&) // pointer_type find (database&, const id_type&) // bool find (database&, const id_type&, T&) // // template class access::object_memory { public: typedef T* pointer_type; }; template class access::object_factory { public: static typename object_memory::pointer_type create () { // By default use pointer-specific construction. // return pointer_factory::pointer_type>::create (); } }; template class access::pointer_factory { public: typedef typename pointer_traits

::type object_type; static P create () { void* v (pointer_traits

::allocate (sizeof (object_type))); mem_guard g (v); P p (new (v) object_type); g.release (); return p; } private: struct mem_guard { mem_guard (void* p): p_ (p) {} ~mem_guard () {if (p_) pointer_traits

::free (p_);} void release () {p_ = 0;} void* p_; }; }; template struct object_traits: access::object_traits { typedef odb::pointer_traits::pointer_type> pointer_traits; }; } #include #endif // ODB_TRAITS_HXX