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:
parent
312efd742e
commit
9d7c715c46
1 changed files with 55 additions and 6 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue