From 8d89bf37dd4ef3cb7373e1841ff57a53916fff0d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 21 Mar 2012 08:36:21 +0200 Subject: Polymorphic inheritance support --- odb/semantics/class.hxx | 2 +- odb/semantics/elements.cxx | 29 +++++++++++++- odb/semantics/elements.hxx | 71 +++++++++++++++++++++++++++++++++++ odb/semantics/relational/elements.cxx | 6 +-- odb/semantics/relational/elements.hxx | 3 +- odb/semantics/unit.hxx | 2 + 6 files changed, 104 insertions(+), 9 deletions(-) (limited to 'odb/semantics') diff --git a/odb/semantics/class.hxx b/odb/semantics/class.hxx index d62de53..b9f8f34 100644 --- a/odb/semantics/class.hxx +++ b/odb/semantics/class.hxx @@ -111,7 +111,7 @@ namespace semantics } using scope::add_edge_left; - using scope::add_edge_right; + using type::add_edge_right; // Resolve conflict between scope::scope and nameable::scope. // diff --git a/odb/semantics/elements.cxx b/odb/semantics/elements.cxx index 85fb203..4b8fcea 100644 --- a/odb/semantics/elements.cxx +++ b/odb/semantics/elements.cxx @@ -322,8 +322,25 @@ namespace semantics void scope:: add_edge_left (names& e) { - names_list::iterator it (names_.insert (names_.end (), &e)); - iterator_map_[&e] = it; + names_list::iterator i (names_.insert (names_.end (), &e)); + iterator_map_[&e] = i; + names_map_[e.name ()].push_back (&e); + } + + void scope:: + add_edge_left (names& e, names_iterator after) + { + names_list::iterator i; + + if (after.base () == names_.end ()) + i = names_.insert (names_.begin (), &e); + else + { + names_list::iterator j (after.base ()); + i = names_.insert (++j, &e); + } + + iterator_map_[&e] = i; names_map_[e.name ()].push_back (&e); } @@ -426,6 +443,14 @@ namespace semantics insert (ti); } + // virtual_data_member + // + { + type_info ti (typeid (virtual_data_member)); + ti.add_base (typeid (data_member)); + insert (ti); + } + // unsupported_type // { diff --git a/odb/semantics/elements.hxx b/odb/semantics/elements.hxx index ef28d23..59e058d 100644 --- a/odb/semantics/elements.hxx +++ b/odb/semantics/elements.hxx @@ -67,6 +67,40 @@ namespace semantics class edge; class unit; + // Support for inserting edges at specified positions. + // + template + struct node_position + { + node_position (N& node, I pos) + : node_ (node), pos_ (pos) + { + } + + operator N& () const + { + return node_; + } + + template + void + add_edge_left (E& e) + { + node_.add_edge_left (e, pos_); + } + + template + void + add_edge_right (E& e) + { + node_.add_edge_right (e, pos_); + } + + private: + N& node_; + I pos_; + }; + // // class edge: public context @@ -529,6 +563,9 @@ namespace semantics void add_edge_left (names&); + void + add_edge_left (names&, names_iterator after); + using nameable::add_edge_right; protected: @@ -544,6 +581,8 @@ namespace semantics // // + class points; + class belongs; class qualifies; @@ -567,6 +606,15 @@ namespace semantics } public: + bool + pointed_p () const {return pointed_ != 0;} + + points& + pointed () const {return *pointed_;} + + public: + type (): pointed_ (0) {} + void add_edge_right (belongs&) { @@ -578,10 +626,17 @@ namespace semantics qualified_.push_back (&e); } + void + add_edge_right (points& e) + { + pointed_ = &e; + } + using nameable::add_edge_right; private: qualified qualified_; + points* pointed_; }; // @@ -688,6 +743,22 @@ namespace semantics : node (file, line, column, tn) { } + + protected: + data_member () + { + } + }; + + // Virtual data member (extension to the standard C++ model). + // + class virtual_data_member: public data_member + { + public: + virtual_data_member (path const& file, size_t line, size_t column) + : node (file, line, column, 0) + { + } }; // Unsupported type. diff --git a/odb/semantics/relational/elements.cxx b/odb/semantics/relational/elements.cxx index 7a0ec1d..a73520c 100644 --- a/odb/semantics/relational/elements.cxx +++ b/odb/semantics/relational/elements.cxx @@ -15,16 +15,14 @@ namespace semantics template <> duplicate_name:: duplicate_name (uscope& s, unameable& o, unameable& d) - : scope (s), orig (o), dup (d), - orig_name (o.name ()), dup_name (d.name ()) + : scope (s), orig (o), dup (d), name (o.name ()) { } template <> duplicate_name:: duplicate_name (qscope& s, qnameable& o, qnameable& d) - : scope (s), orig (o), dup (d), - orig_name (o.name ().string ()), dup_name (d.name ().string ()) + : scope (s), orig (o), dup (d), name (o.name ().string ()) { } diff --git a/odb/semantics/relational/elements.hxx b/odb/semantics/relational/elements.hxx index 9d98619..6b4964e 100644 --- a/odb/semantics/relational/elements.hxx +++ b/odb/semantics/relational/elements.hxx @@ -212,8 +212,7 @@ namespace semantics node& orig; node& dup; - string orig_name; - string dup_name; + string name; }; template diff --git a/odb/semantics/unit.hxx b/odb/semantics/unit.hxx index 11c8a8a..ca001b1 100644 --- a/odb/semantics/unit.hxx +++ b/odb/semantics/unit.hxx @@ -37,6 +37,8 @@ namespace semantics tree_node_map_[key] = &value; } + using namespace_::find; + // Mapping from tree nodes to name hints. // public: -- cgit v1.1