summaryrefslogtreecommitdiff
path: root/odb/semantics
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-03-21 08:36:21 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-04-23 16:50:56 +0200
commit8d89bf37dd4ef3cb7373e1841ff57a53916fff0d (patch)
tree704b7de0338eba0e008a96a09b6d57e86846d1b1 /odb/semantics
parent68ff21c56fb287790440208907ad2a851a108f89 (diff)
Polymorphic inheritance support
Diffstat (limited to 'odb/semantics')
-rw-r--r--odb/semantics/class.hxx2
-rw-r--r--odb/semantics/elements.cxx29
-rw-r--r--odb/semantics/elements.hxx71
-rw-r--r--odb/semantics/relational/elements.cxx6
-rw-r--r--odb/semantics/relational/elements.hxx3
-rw-r--r--odb/semantics/unit.hxx2
6 files changed, 104 insertions, 9 deletions
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 <typename N, typename I>
+ struct node_position
+ {
+ node_position (N& node, I pos)
+ : node_ (node), pos_ (pos)
+ {
+ }
+
+ operator N& () const
+ {
+ return node_;
+ }
+
+ template <typename E>
+ void
+ add_edge_left (E& e)
+ {
+ node_.add_edge_left (e, pos_);
+ }
+
+ template <typename E>
+ 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 <typename N>
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: