From 428558c89850fe8c79b9c89a943bd996912d12f5 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 5 Sep 2011 10:36:33 +0200 Subject: Support for views; native part --- odb/common.cxx | 81 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 28 deletions(-) (limited to 'odb/common.cxx') diff --git a/odb/common.cxx b/odb/common.cxx index 81f8155..036b491 100644 --- a/odb/common.cxx +++ b/odb/common.cxx @@ -44,6 +44,14 @@ traverse_object (semantics::class_& c) } void object_members_base:: +traverse_view (semantics::class_& c) +{ + // A view has no bases. + // + names (c); +} + +void object_members_base:: traverse (semantics::data_member& m, semantics::class_& c) { traverse_composite_wrapper (&m, c, 0); @@ -52,24 +60,28 @@ traverse (semantics::data_member& m, semantics::class_& c) void object_members_base:: traverse (semantics::class_& c) { - bool obj (object (c)); + class_kind_type k (class_kind (c)); - // Ignore transient bases. - // - if (!(obj || context::composite (c))) + if (k == class_other) + { + // Ignore transient bases. + // + assert (context::top_object != 0); return; - - semantics::class_* prev; - if (obj) + } + else if (k == class_composite) { - prev = context::cur_object; - context::cur_object = &c; - - if (context::top_object == 0) - context::top_object = &c; + traverse_composite_wrapper (0, c, 0); + return; } - if (obj && build_table_prefix_) + semantics::class_* prev (context::cur_object); + context::cur_object = &c; + + if (context::top_object == 0) + context::top_object = &c; + + if (build_table_prefix_) { // Don't reset the table prefix if we are traversing a base. // @@ -83,7 +95,10 @@ traverse (semantics::class_& c) tb = true; } - traverse_object (c); + if (k == class_object) + traverse_object (c); + else + traverse_view (c); if (tb) { @@ -93,19 +108,16 @@ traverse (semantics::class_& c) } else { - if (obj) + if (k == class_object) traverse_object (c); else - traverse_composite_wrapper (0, c, 0); + traverse_view (c); } - if (obj) - { - if (prev == 0) - context::top_object = 0; + if (prev == 0) + context::top_object = 0; - context::cur_object = prev; - } + context::cur_object = prev; } void object_members_base::member:: @@ -206,6 +218,14 @@ traverse_object (semantics::class_& c) } void object_columns_base:: +traverse_view (semantics::class_& c) +{ + // A view has no bases. + // + names (c); +} + +void object_columns_base:: traverse (semantics::data_member& m, semantics::class_& c, string const& key_prefix, @@ -236,12 +256,15 @@ traverse (semantics::data_member& m, void object_columns_base:: traverse (semantics::class_& c) { - bool obj (object (c)); + class_kind_type k (class_kind (c)); // Ignore transient bases. // - if (!(obj || context::composite (c))) + if (k == class_other) + { + assert (context::top_object != 0); return; + } bool f (top_level_); @@ -249,7 +272,7 @@ traverse (semantics::class_& c) top_level_ = false; semantics::class_* prev; - if (obj) + if (k == class_object || k == class_view) { prev = context::cur_object; context::cur_object = &c; @@ -258,12 +281,14 @@ traverse (semantics::class_& c) context::top_object = &c; } - if (obj) + if (k == class_object) traverse_object (c); - else + else if (k == class_view) + traverse_view (c); + else if (k == class_composite) traverse_composite (0, c); - if (obj) + if (k == class_object || k == class_view) { if (prev == 0) context::top_object = 0; -- cgit v1.1