// file : boost/common/smart-ptr/driver.cxx // license : GNU GPL v2; see accompanying LICENSE file // Test boost smart pointers. // #include // std::auto_ptr #include #include #include #include #include #include #include "test.hxx" #include "test-odb.hxx" using namespace std; using namespace odb::boost; using namespace odb::core; int main (int argc, char* argv[]) { using boost::shared_ptr; try { auto_ptr db (create_database (argc, argv)); shared_ptr c1 (new cont (1)); { transaction t (db->begin ()); db->persist (c1); t.commit (); } // Test comparison operators. // { assert (lazy_shared_ptr () == lazy_shared_ptr ()); assert (lazy_shared_ptr () != lazy_shared_ptr (c1)); assert (lazy_shared_ptr (c1) == lazy_shared_ptr (c1)); lazy_shared_ptr lc1 (*db, 1); assert (lc1 != lazy_shared_ptr ()); assert (lc1 == lazy_shared_ptr (*db, c1)); shared_ptr c2 (new cont (2)); assert (lc1 != lazy_shared_ptr (*db, c2)); } // Test swap. // { lazy_shared_ptr lx (*db, 1), ly; assert (lx == lazy_shared_ptr (*db, c1)); swap (lx, ly); assert (lx == lazy_shared_ptr ()); assert (ly == lazy_shared_ptr (*db, c1)); } // Test assignment from auto_ptr. // { cont* p = new cont (3); auto_ptr a (p); lazy_shared_ptr l; l = a; assert (l.get() == p); assert (!a.get ()); } shared_ptr o1 (new obj (1)); shared_ptr o2 (new obj (2)); shared_ptr o3 (new obj (3)); shared_ptr o4 (new obj (4)); shared_ptr c2 (new cont (2)); o1->c = c1; o2->c = c1; o3->c = c2; o4->c = c2; // Persist. // { transaction t (db->begin ()); db->persist (o1); db->persist (o2); db->persist (o3); db->persist (o4); db->persist (c2); t.commit (); } // Load. // { session s; transaction t (db->begin ()); shared_ptr c (db->load (1)); shared_ptr o (db->load (1)); // Ensure that lazy pointers are present but not loaded. // assert (c->o.size () == 2); assert (!c->o[0].loaded ()); assert (!c->o[1].loaded ()); assert (!o->c.loaded ()); // Ensure that the correct object IDs were loaded. // assert (c->o[0].object_id () == 1); assert (c->o[1].object_id () == 2); assert (o->c.object_id () == 1); // Load the lazy pointer targets ensuring that the loaded // targets correspond to the cached session objects. // shared_ptr cl (o->c.load ()); shared_ptr ol (c->o[0].load ()); assert (c->o[0].loaded ()); assert (o->c.loaded ()); assert (cl == c); assert (ol == o); t.commit (); } // Test lazy weak locking and reloading. // { // No session. // transaction t (db->begin ()); shared_ptr c (db->load (1)); // Lock. // assert (!c->o[1].loaded ()); lazy_shared_ptr l (c->o[1].lock ()); assert (!l.loaded ()); assert (l.object_id () == c->o[1].object_id ()); // Reload. // assert (!c->o[1].loaded ()); shared_ptr ol (c->o[1].load ()); assert (c->o[1].loaded ()); ol.reset (); assert (!c->o[1].loaded ()); ol = c->o[1].load (); assert (c->o[1].loaded ()); t.commit (); } // // Test shared_ptr as a value wrapper. // { obj2 o1 (1); obj2 o2 (2); o2.str.reset (new string ("abc")); transaction t (db->begin ()); db->persist (o1); db->persist (o2); t.commit (); } { transaction t (db->begin ()); shared_ptr o1 (db->load (1)); shared_ptr o2 (db->load (2)); t.commit (); assert (!o1->str); assert (o2->str && *o2->str == "abc"); } } catch (const odb::exception& e) { cerr << e.what () << endl; return 1; } }