aboutsummaryrefslogtreecommitdiff
path: root/composite
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-01-08 17:27:40 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-01-08 17:27:40 +0200
commit24f87489a4d315cc01ca9d49a3f0209522fe6729 (patch)
tree260a5479af34c9452679d63f9c892288417acac4 /composite
parent0431bdb607d898c1efb59211568b43ebd6890e25 (diff)
Add support for defining composite value type as class template instantiations
Diffstat (limited to 'composite')
-rw-r--r--composite/README6
-rw-r--r--composite/driver.cxx7
-rw-r--r--composite/person.hxx20
3 files changed, 27 insertions, 6 deletions
diff --git a/composite/README b/composite/README
index bf9e745..e33e7a9 100644
--- a/composite/README
+++ b/composite/README
@@ -7,8 +7,10 @@ The example consists of the following files:
person.hxx
Header file defining the 'basic_name', 'name_extras', and 'name' composite
- value types. It also defines the 'person' persistent class which use the
- 'name' value type in one of its data members.
+ value types. It also defines the 'phone_numbers' composite value type as
+ an instantiation of the 'std::pair' class template. Finally it defines
+ the 'person' persistent class which uses the 'name' and 'phone_numbers'
+ value types in its data members.
person-odb.hxx
person-odb.ixx
diff --git a/composite/driver.cxx b/composite/driver.cxx
index 56be15d..346e768 100644
--- a/composite/driver.cxx
+++ b/composite/driver.cxx
@@ -27,7 +27,7 @@ main (int argc, char* argv[])
//
unsigned int id;
{
- person p ("Joe", "Dirt", "Mr");
+ person p ("Joe", "Dirt", "Mr", phone_numbers ("555 5555", "666 6666"));
transaction t (db->begin ());
id = db->persist (p);
@@ -49,7 +49,7 @@ main (int argc, char* argv[])
t.commit ();
}
- // Print the name information.
+ // Print the name and phone numbers.
//
{
transaction t (db->begin ());
@@ -71,6 +71,9 @@ main (int argc, char* argv[])
{
cout << " alias: " << i->first () << " " << i->last () << endl;
}
+
+ cout << " phone 1: " << joe->phone ().first << endl;
+ cout << " phone 2: " << joe->phone ().second << endl;
}
// Query the database for a person object.
diff --git a/composite/person.hxx b/composite/person.hxx
index dfc44e6..92da60c 100644
--- a/composite/person.hxx
+++ b/composite/person.hxx
@@ -123,6 +123,12 @@ private:
name_extras extras_;
};
+// We can also define a composite value type as a class template
+// instantiation. Here we use std::pair to store person's phone
+// numbers, in the order of preference.
+//
+typedef std::pair<std::string, std::string> phone_numbers;
+#pragma db value(phone_numbers)
#pragma db object
class person
@@ -130,8 +136,9 @@ class person
public:
person (const std::string& first,
const std::string& last,
- const std::string& title)
- : name_ (first, last, title)
+ const std::string& title,
+ const phone_numbers& phone)
+ : name_ (first, last, title), phone_ (phone)
{
}
@@ -151,6 +158,14 @@ public:
return name_;
}
+ // Phone.
+ //
+ const phone_numbers&
+ phone () const
+ {
+ return phone_;
+ }
+
private:
friend class odb::access;
@@ -160,6 +175,7 @@ private:
unsigned long id_;
name_type name_;
+ phone_numbers phone_;
};
#endif // PERSON_HXX