diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-04 13:29:43 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-04 13:29:43 +0200 |
commit | 18ef14486e46064f4317ab407c5fe0afa3209d4b (patch) | |
tree | f70e9fb4a7d492197dca3f1fcbf05ffdf308af1a /common/wrapper/driver.cxx | |
parent | 84b6d8488a2415c1c6c91b2234993497ab8f792b (diff) |
Add support for value wrappers
Wrapper is a class that wraps another type. Examples of wrappers are
various smart pointers, holders, etc. A wrapper can be transparent or
it can handle the NULL semantics.
The new odb::nullable class template is a NULL wrapper that helps
to add the NULL semantics to a value type.
New test: common/wrapper.
Diffstat (limited to 'common/wrapper/driver.cxx')
-rw-r--r-- | common/wrapper/driver.cxx | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/common/wrapper/driver.cxx b/common/wrapper/driver.cxx new file mode 100644 index 0000000..ed4d83f --- /dev/null +++ b/common/wrapper/driver.cxx @@ -0,0 +1,73 @@ +// file : common/wrapper/driver.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +// Test wrapper machinery. +// + +#include <memory> // std::auto_ptr +#include <cassert> +#include <iostream> + +#include <odb/database.hxx> +#include <odb/transaction.hxx> + +#include <common/common.hxx> + +#include "test.hxx" +#include "test-odb.hxx" + +using namespace std; +using namespace odb::core; + +int +main (int argc, char* argv[]) +{ + try + { + auto_ptr<database> db (create_database (argc, argv)); + + // + // + unsigned long id; + { + object o; + o.num.reset (new unsigned long (123)); + o.nstrs.push_back (nullable_string ()); + o.nstrs.push_back (nullable_string ("123")); +#ifdef HAVE_TR1_MEMORY + o.tr1_strs.push_back (tr1_nullable_string ()); + o.tr1_strs.push_back (tr1_nullable_string (new string ("123"))); +#endif + + transaction t (db->begin ()); + id = db->persist (o); + t.commit (); + } + + // + // + { + transaction t (db->begin ()); + auto_ptr<object> o (db->load<object> (id)); + t.commit (); + + assert (*o->num == 123); + assert (o->str.get () == 0); + assert (o->nstr.null ()); + assert (o->nstrs[0].null ()); + assert (o->nstrs[1].get () == "123"); +#ifdef HAVE_TR1_MEMORY + assert (!o->tr1_str); + assert (!o->tr1_strs[0]); + assert (*o->tr1_strs[1] == "123"); +#endif + } + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + return 1; + } +} |