From 7f6c64f2211d37db76a97fbc79a4b5492302ef2f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 27 Oct 2010 17:36:59 +0200 Subject: Implement support for composite value types New test: common/composite. --- odb/context.cxx | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 3 deletions(-) (limited to 'odb/context.cxx') 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 ("column") : public_name (m); + return m.count ("column") ? m.get ("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 ("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 ("column-count"); + + column_count_impl t; + t.traverse (c); + return t.count (); +} + // namespace // -- cgit v1.1