diff options
-rw-r--r-- | odb/pragma.cxx | 4 | ||||
-rw-r--r-- | odb/pragma.hxx | 37 |
2 files changed, 27 insertions, 14 deletions
diff --git a/odb/pragma.cxx b/odb/pragma.cxx index 9d97d2a..afdbd1d 100644 --- a/odb/pragma.cxx +++ b/odb/pragma.cxx @@ -2640,7 +2640,7 @@ handle_pragma_qualifier (cxx_lexer& l, string const& p) tt = l.next (tl, &tn); } - pair<virt_declaration_set::iterator, bool> r ( + pair<virt_declaration_set::const_iterator, bool> r ( virt_declarations_[scope].insert ( virt_declaration (loc, name, FIELD_DECL, type))); @@ -2676,7 +2676,7 @@ handle_pragma_qualifier (cxx_lexer& l, string const& p) if (i != virt_declarations_.end ()) { - virt_declaration_set::iterator j ( + virt_declaration_set::const_iterator j ( i->second.find (name_tokens.back ().literal, FIELD_DECL)); if (j != i->second.end ()) diff --git a/odb/pragma.hxx b/odb/pragma.hxx index f656079..efb80d8 100644 --- a/odb/pragma.hxx +++ b/odb/pragma.hxx @@ -13,6 +13,7 @@ #include <string> #include <cutl/container/any.hxx> +#include <cutl/container/multi-index.hxx> #include <cutl/compiler/context.hxx> struct virt_declaration @@ -30,25 +31,37 @@ struct virt_declaration // different tree codes unequal. If that is too loose, then the // inserting code must do additional checks. // -struct virt_declaration_comparator +struct virt_declaration_set { - bool - operator () (virt_declaration const& x, virt_declaration const& y) const + typedef cutl::container::key<std::string, int> key; + typedef std::map<key, virt_declaration> map; + typedef cutl::container::map_const_iterator<map> const_iterator; + + std::pair<const_iterator, bool> + insert (const virt_declaration& v) { - return x.name < y.name || (x.name == y.name && x.tree_code < y.tree_code); - } -}; + std::pair<map::iterator, bool> r ( + map_.insert (map::value_type (key (v.name, v.tree_code), v))); -struct virt_declaration_set: - std::set<virt_declaration, virt_declaration_comparator> -{ - typedef std::set<virt_declaration, virt_declaration_comparator> base; + const_iterator i (r.first); - iterator + if (r.second) + r.first->first.assign (i->name, i->tree_code); + + return std::make_pair (i, r.second); + } + + const_iterator find (std::string const& name, int tree_code) const { - return base::find (virt_declaration (0, name, tree_code, 0)); + return map_.find (key (name, tree_code)); } + + const_iterator begin () const {return map_.begin ();} + const_iterator end () const {return map_.end ();} + +private: + map map_; }; // Map of scopes (e.g., class, namespace) to sets of virtual declarations. |