summaryrefslogtreecommitdiff
path: root/odb/context.cxx
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/context.cxx
parent5259b98c75f3754a0f713bcee4bddd0ed7ce35ef (diff)
Implement support for composite value types
New test: common/composite.
Diffstat (limited to 'odb/context.cxx')
-rw-r--r--odb/context.cxx82
1 files changed, 79 insertions, 3 deletions
diff --git a/odb/context.cxx b/odb/context.cxx
index 236c0c0..c578cd9 100644
--- a/odb/context.cxx
+++ b/odb/context.cxx
@@ -119,8 +119,8 @@ context::
{
}
-string context::
-public_name (semantics::data_member& m) const
+static string
+public_name_impl (semantics::data_member& m)
{
string s (m.name ());
size_t n (s.size ());
@@ -153,7 +153,7 @@ table_name (semantics::type& t) const
string context::
column_name (semantics::data_member& m) const
{
- return m.count ("column") ? m.get<string> ("column") : public_name (m);
+ return m.count ("column") ? m.get<string> ("column") : public_name_impl (m);
}
string context::
@@ -188,6 +188,12 @@ column_type (semantics::data_member& m) const
}
string context::
+public_name (semantics::data_member& m) const
+{
+ return escape (public_name_impl (m));
+}
+
+string context::
escape (string const& name) const
{
typedef string::size_type size;
@@ -261,6 +267,76 @@ escape (string const& name) const
return r;
}
+namespace
+{
+ struct column_count_impl: traversal::class_
+ {
+ column_count_impl ()
+ : member_ (*this)
+ {
+ *this >> names_ >> member_;
+ *this >> inherits_ >> *this;
+ }
+
+ size_t
+ count () const
+ {
+ return member_.count_;
+ }
+
+ virtual void
+ traverse (semantics::class_& c)
+ {
+ if (c.count ("column-count"))
+ member_.count_ += c.get<size_t> ("column-count");
+ else
+ {
+ size_t n (member_.count_);
+ inherits (c);
+ names (c);
+ c.set ("column-count", member_.count_ - n);
+ }
+ }
+
+ private:
+ struct member: traversal::data_member
+ {
+ member (column_count_impl& cc): count_ (0), cc_ (cc) {}
+
+ virtual void
+ traverse (semantics::data_member& m)
+ {
+ if (m.count ("transient"))
+ return;
+
+ if (context::comp_value (m.type ()))
+ cc_.dispatch (m.type ());
+ else
+ count_++;
+ }
+
+ size_t count_;
+ column_count_impl& cc_;
+ };
+
+ member member_;
+ traversal::names names_;
+
+ traversal::inherits inherits_;
+ };
+}
+
+size_t context::
+column_count (semantics::class_& c)
+{
+ if (c.count ("column-count"))
+ return c.get<size_t> ("column-count");
+
+ column_count_impl t;
+ t.traverse (c);
+ return t.count ();
+}
+
// namespace
//