// file : odb/tr1/lazy-ptr.txx // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file namespace odb { namespace tr1 { // // lazy_shared_ptr // template template bool lazy_shared_ptr:: equal (const lazy_shared_ptr& r) const { bool t1 (!p_ == loaded ()); bool t2 (!r.p_ == r.loaded ()); // If both are transient, then compare the underlying pointers. // if (t1 && t2) return p_ == r.p_; // If one is transient and the other is persistent, then compare // the underlying pointers but only if they are non NULL. Note // that an unloaded persistent object is always unequal to a // transient object. // if (t1 || t2) return p_ == r.p_ && p_; // If both objects are persistent, then we compare databases and // object ids. // typedef typename object_traits::object_type object_type1; typedef typename object_traits::object_type object_type2; return i_.database () == r.i_.database () && object_id () == r.template object_id (); } // // lazy_weak_ptr // template lazy_shared_ptr lazy_weak_ptr:: lock () const { std::tr1::shared_ptr sp (p_.lock ()); if (sp) { if (database_type* db = i_.database ()) return lazy_shared_ptr (*db, sp); else return lazy_shared_ptr (sp); } else { if (i_) return lazy_shared_ptr ( *i_.database (), i_.template object_id ()); else return lazy_shared_ptr (); } } } }