From 6508eb18a20a2f0bc48374f3f0a352f1195cc95b Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 15 Oct 2011 11:33:40 +0200 Subject: Add support for readonly members New pragma: readonly. New test: readonly. --- odb/common.cxx | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'odb/common.cxx') diff --git a/odb/common.cxx b/odb/common.cxx index 98f92c7..bc9e214 100644 --- a/odb/common.cxx +++ b/odb/common.cxx @@ -54,7 +54,21 @@ traverse_view (semantics::class_& c) void object_members_base:: traverse (semantics::data_member& m, semantics::class_& c) { + // We are starting from the member. Add an empty chain which + // corresponds to the scope that contains this member. + // + //member_scope_.push_back (class_inheritance_chain ()); + //member_path_.push_back (&m); + + member_scope_.push_back (class_inheritance_chain ()); + member_scope_.back ().push_back (&c); + traverse_composite_wrapper (&m, c, 0); + + member_scope_.pop_back (); + + //member_path_.pop_back (); + //member_scope_.pop_back (); } void object_members_base:: @@ -71,7 +85,18 @@ traverse (semantics::class_& c) } else if (k == class_composite) { + if (member_scope_.empty ()) + member_scope_.push_back (class_inheritance_chain ()); + + member_scope_.back ().push_back (&c); + traverse_composite_wrapper (0, c, 0); + + member_scope_.back ().pop_back (); + + if (member_scope_.back ().empty ()) + member_scope_.pop_back (); + return; } @@ -81,6 +106,11 @@ traverse (semantics::class_& c) if (context::top_object == 0) context::top_object = &c; + if (member_scope_.empty ()) + member_scope_.push_back (class_inheritance_chain ()); + + member_scope_.back ().push_back (&c); + if (build_table_prefix_) { // Don't reset the table prefix if we are traversing a base. @@ -114,6 +144,11 @@ traverse (semantics::class_& c) traverse_view (c); } + member_scope_.back ().pop_back (); + + if (member_scope_.back ().empty ()) + member_scope_.pop_back (); + if (prev == 0) context::top_object = 0; @@ -126,10 +161,15 @@ traverse (semantics::data_member& m) if (transient (m)) return; + om_.member_path_.push_back (&m); + semantics::type& t (m.type ()); if (semantics::class_* comp = context::composite_wrapper (t)) { + om_.member_scope_.push_back (class_inheritance_chain ()); + om_.member_scope_.back ().push_back (comp); + string old_flat_prefix, old_table_prefix, old_member_prefix; if (om_.build_flat_prefix_) @@ -165,6 +205,8 @@ traverse (semantics::data_member& m) if (om_.build_member_prefix_) om_.member_prefix_ = old_member_prefix; + + om_.member_scope_.pop_back (); } else if (semantics::type* c = context::container_wrapper (t)) { @@ -174,6 +216,8 @@ traverse (semantics::data_member& m) { om_.traverse_simple (m); } + + om_.member_path_.pop_back (); } void object_members_base:: @@ -248,12 +292,26 @@ traverse (semantics::data_member& m, string const& key_prefix, string const& default_name) { + // We are starting from the member. Add an empty chain which + // corresponds to the scope that contains this member. + // + //member_scope_.push_back (class_inheritance_chain ()); + //member_path_.push_back (&m); + + member_scope_.push_back (class_inheritance_chain ()); + member_scope_.back ().push_back (&c); + column_prefix_ = column_prefix (m, key_prefix, default_name); traverse_composite (&m, c); if (!member_.first_) flush (); + + member_scope_.pop_back (); + + //member_path_.pop_back (); + //member_scope_.pop_back (); } void object_columns_base:: @@ -284,6 +342,11 @@ traverse (semantics::class_& c) context::top_object = &c; } + if (member_scope_.empty ()) + member_scope_.push_back (class_inheritance_chain ()); + + member_scope_.back ().push_back (&c); + if (k == class_object) traverse_object (c); else if (k == class_view) @@ -291,6 +354,11 @@ traverse (semantics::class_& c) else if (k == class_composite) traverse_composite (0, c); + member_scope_.back ().pop_back (); + + if (member_scope_.back ().empty ()) + member_scope_.pop_back (); + if (k == class_object || k == class_view) { if (prev == 0) @@ -340,16 +408,23 @@ traverse (semantics::data_member& m) if (transient (m)) return; + oc_.member_path_.push_back (&m); + semantics::type& t (m.type ()); if (semantics::class_* comp = composite_wrapper (t)) { + oc_.member_scope_.push_back (class_inheritance_chain ()); + oc_.member_scope_.back ().push_back (comp); + string old_prefix (oc_.column_prefix_); oc_.column_prefix_ += column_prefix (m); oc_.traverse_composite (&m, *comp); oc_.column_prefix_ = old_prefix; + + oc_.member_scope_.pop_back (); } else if (container_wrapper (t)) { @@ -364,4 +439,6 @@ traverse (semantics::data_member& m) first_ = false; } } + + oc_.member_path_.pop_back (); } -- cgit v1.1