From 1095648630d3b8d67c94d84004da085a5a93fc0d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 29 Sep 2015 11:33:08 +0200 Subject: Initial take on virtual see-through members Notes: 1. Probably better to have a separate marker, like transient. 2. No reason to limit this to virtual members. 3. Probably makes sense to also automatically set column to empty. --- odb/common-query.cxx | 24 +++++++++++++++--------- odb/relational/source.cxx | 19 ++++++++++++++----- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/odb/common-query.cxx b/odb/common-query.cxx index 22407fc..df2e92f 100644 --- a/odb/common-query.cxx +++ b/odb/common-query.cxx @@ -41,7 +41,9 @@ struct query_nested_types: object_columns_base, virtual context virtual void traverse_composite (semantics::data_member* m, semantics::class_& c) { - if (m != 0) + // Virtual data members that start with an underscore are "see-through". + // + if (m != 0 && (!m->count ("virtual") || m->name ()[0] != '_')) { string name (prefix_ + public_name (*m)); name += in_ptr_ ? "_column_class" : "_class"; @@ -172,9 +174,10 @@ traverse_object (semantics::class_& c) void query_tags:: traverse_composite (semantics::data_member* m, semantics::class_& c) { - // Base type. + // Base type or a virtual data member that starts with an underscore + // ("see-through"). // - if (m == 0) + if (m == 0 || (m->count ("virtual") && m->name ()[0] == '_')) { object_columns_base::traverse_composite (m, c); return; @@ -242,9 +245,10 @@ traverse_object (semantics::class_& c) void query_alias_traits:: traverse_composite (semantics::data_member* m, semantics::class_& c) { - // Base type. + // Base type or a virtual data member that starts with an underscore + // ("see-through"). // - if (m == 0) + if (m == 0 || (m->count ("virtual") && m->name ()[0] == '_')) { object_columns_base::traverse_composite (m, c); return; @@ -361,9 +365,10 @@ traverse_object (semantics::class_& c) void query_columns_base:: traverse_composite (semantics::data_member* m, semantics::class_& c) { - // Base type. + // Base type or a virtual data member that starts with an underscore + // ("see-through"). // - if (m == 0) + if (m == 0 || (m->count ("virtual") && m->name ()[0] == '_')) { object_columns_base::traverse_composite (m, c); return; @@ -516,9 +521,10 @@ traverse_object (semantics::class_& c) void query_columns:: traverse_composite (semantics::data_member* m, semantics::class_& c) { - // Base type. + // Base type or a virtual data member that starts with an underscore + // ("see-through"). // - if (m == 0) + if (m == 0 || (m->count ("virtual") && m->name ()[0] == '_')) { object_columns_base::traverse_composite (m, c); return; diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx index e9ddd77..d32a52a 100644 --- a/odb/relational/source.cxx +++ b/odb/relational/source.cxx @@ -5881,8 +5881,6 @@ namespace relational } expression e (vo); - r += "::"; - r += ctx.public_name (*m); // Assemble the member path if we may need to return a pointer // expression. @@ -5894,6 +5892,7 @@ namespace relational // Finally, resolve nested members if any. // + bool first (true); for (; tt == CPP_DOT; ptt = tt, tt = l.next (tl, &tn)) { // Check if this member is actually of a composite value type. @@ -5904,9 +5903,19 @@ namespace relational // semantics::class_* comp ( context::composite_wrapper (context::utype (*m))); + if (comp == 0) break; + // Handle "see-through" virtual data members. + // + if (!m->count ("virtual") || m->name ()[0] != '_') + { + r += (first ? "::" : "."); + r += ctx.public_name (*m); + first = false; + } + ptt = tt; tt = l.next (tl, &tn); @@ -5919,13 +5928,13 @@ namespace relational m = &comp->lookup (tl, scope::include_hidden); - r += '.'; - r += ctx.public_name (*m); - if (check_ptr) e.member_path.push_back (m); } + r += (first ? "::" : "."); + r += ctx.public_name (*m); + // If requested, check if this member is a pointer. We only do this // if there is nothing after this name. // -- cgit v1.1