aboutsummaryrefslogtreecommitdiff
path: root/odb/common.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-10-27 17:36:59 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-10-27 17:36:59 +0200
commit7f6c64f2211d37db76a97fbc79a4b5492302ef2f (patch)
treef2e386644fcaab5c51e3f5ad0ac737ea5b4d5bd2 /odb/common.hxx
parent5259b98c75f3754a0f713bcee4bddd0ed7ce35ef (diff)
Implement support for composite value types
New test: common/composite.
Diffstat (limited to 'odb/common.hxx')
-rw-r--r--odb/common.hxx50
1 files changed, 29 insertions, 21 deletions
diff --git a/odb/common.hxx b/odb/common.hxx
index 952a7dd..dcfe87f 100644
--- a/odb/common.hxx
+++ b/odb/common.hxx
@@ -6,7 +6,9 @@
#ifndef ODB_COMMON_HXX
#define ODB_COMMON_HXX
+#include <string>
#include <cstddef> // std::size_t
+
#include <odb/context.hxx>
// Find id member.
@@ -48,43 +50,49 @@ private:
traversal::names names_;
};
-// Count persistent members.
+// Traverse object columns.
//
-struct member_count: traversal::class_
+struct object_columns_base: traversal::class_
{
- member_count ()
- {
- *this >> names_ >> member_;
- }
+ virtual void
+ column (semantics::data_member&, std::string const& name, bool first) = 0;
- std::size_t
- count () const
+ // If you override this callback, always call the base.
+ //
+ virtual void
+ composite (semantics::data_member&);
+
+ object_columns_base (context& c)
+ : member_ (c, *this)
{
- return member_.count_;
+ *this >> names_ >> member_;
+ *this >> inherits_ >> *this;
}
virtual void
- traverse (semantics::class_& c)
- {
- member_.count_ = 0;
- names (c);
- }
+ traverse (semantics::class_&);
private:
- struct data_member: traversal::data_member
+ struct member: traversal::data_member, context
{
- virtual void
- traverse (semantics::data_member& m)
+ member (context& c, object_columns_base& oc)
+ : context (c), oc_ (oc), first_ (true)
{
- if (!m.count ("transient"))
- count_++;
}
- std::size_t count_;
+ virtual void
+ traverse (semantics::data_member&);
+
+ private:
+ object_columns_base& oc_;
+
+ string prefix_;
+ bool first_;
};
- data_member member_;
+ member member_;
traversal::names names_;
+ traversal::inherits inherits_;
};
#endif // ODB_COMMON_HXX