aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb/pragma.cxx4
-rw-r--r--odb/pragma.hxx37
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.