aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-09-29 11:33:08 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-09-29 11:33:08 +0200
commit1095648630d3b8d67c94d84004da085a5a93fc0d (patch)
tree298c90a488b4b3ec26e550611c216abb7c274b60
parent7ac7872103a868f4232f4284aeefc1762bd75a89 (diff)
Initial take on virtual see-through memberssee_through_member
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.
-rw-r--r--odb/common-query.cxx24
-rw-r--r--odb/relational/source.cxx19
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<data_member> (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.
//