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"
/**
* 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>
class range_map
{
@ -45,9 +51,34 @@ class range_map
public:
typedef typename RangeMap::iterator iterator;
typedef typename RangeMap::const_iterator const_iterator;
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)
{
iterator i;
@ -62,7 +93,7 @@ class range_map
return tree.end();
}
i--;
--i;
if (i->first.start <= r.end && i->first.end >= r.start)
return i;
@ -71,7 +102,14 @@ class range_map
}
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)
{
return find(RangeSize(r, 1));
@ -88,7 +126,6 @@ class range_map
return false;
}
template <class U,class W>
iterator
insert(const Range<U> &r, const W d)
@ -123,12 +160,24 @@ class range_map
tree.erase(tree.begin(), tree.end());
}
const_iterator
begin() const
{
return tree.begin();
}
iterator
begin()
{
return tree.begin();
}
const_iterator
end() const
{
return tree.end();
}
iterator
end()
{
@ -136,13 +185,13 @@ class range_map
}
size_t
size()
size() const
{
return tree.size();
}
bool
empty()
empty() const
{
return tree.empty();
}