range_map: Enable const find and iteration

This patch adds const access functions to the range_map to enable its use
in a const context, similar to the STL container classes.
This commit is contained in:
Andreas Hansson 2012-03-26 05:37:00 -04:00
parent 312efd742e
commit 9d7c715c46

View file

@ -36,6 +36,12 @@
#include "base/range.hh" #include "base/range.hh"
/**
* The range_map uses an STL map to implement an interval tree. The
* type of both the key (range) and the value are template
* parameters. It can, for example, be used for address decoding,
* using a range of addresses to map to ports.
*/
template <class T,class V> template <class T,class V>
class range_map class range_map
{ {
@ -45,9 +51,34 @@ class range_map
public: public:
typedef typename RangeMap::iterator iterator; typedef typename RangeMap::iterator iterator;
typedef typename RangeMap::const_iterator const_iterator;
template <class U> template <class U>
const iterator const_iterator
find(const Range<U> &r) const
{
const_iterator i;
i = tree.upper_bound(r);
if (i == tree.begin()) {
if (i->first.start <= r.end && i->first.end >= r.start)
return i;
else
// Nothing could match, so return end()
return tree.end();
}
--i;
if (i->first.start <= r.end && i->first.end >= r.start)
return i;
return tree.end();
}
template <class U>
iterator
find(const Range<U> &r) find(const Range<U> &r)
{ {
iterator i; iterator i;
@ -62,7 +93,7 @@ class range_map
return tree.end(); return tree.end();
} }
i--; --i;
if (i->first.start <= r.end && i->first.end >= r.start) if (i->first.start <= r.end && i->first.end >= r.start)
return i; return i;
@ -71,7 +102,14 @@ class range_map
} }
template <class U> template <class U>
const iterator const_iterator
find(const U &r) const
{
return find(RangeSize(r, 1));
}
template <class U>
iterator
find(const U &r) find(const U &r)
{ {
return find(RangeSize(r, 1)); return find(RangeSize(r, 1));
@ -88,7 +126,6 @@ class range_map
return false; return false;
} }
template <class U,class W> template <class U,class W>
iterator iterator
insert(const Range<U> &r, const W d) insert(const Range<U> &r, const W d)
@ -123,12 +160,24 @@ class range_map
tree.erase(tree.begin(), tree.end()); tree.erase(tree.begin(), tree.end());
} }
const_iterator
begin() const
{
return tree.begin();
}
iterator iterator
begin() begin()
{ {
return tree.begin(); return tree.begin();
} }
const_iterator
end() const
{
return tree.end();
}
iterator iterator
end() end()
{ {
@ -136,13 +185,13 @@ class range_map
} }
size_t size_t
size() size() const
{ {
return tree.size(); return tree.size();
} }
bool bool
empty() empty() const
{ {
return tree.empty(); return tree.empty();
} }