addr_range_map.hh revision 5608
12623SN/A/*
22623SN/A * Copyright (c) 2006 The Regents of The University of Michigan
32623SN/A * All rights reserved.
42623SN/A *
52623SN/A * Redistribution and use in source and binary forms, with or without
62623SN/A * modification, are permitted provided that the following conditions are
72623SN/A * met: redistributions of source code must retain the above copyright
82623SN/A * notice, this list of conditions and the following disclaimer;
92623SN/A * redistributions in binary form must reproduce the above copyright
102623SN/A * notice, this list of conditions and the following disclaimer in the
112623SN/A * documentation and/or other materials provided with the distribution;
122623SN/A * neither the name of the copyright holders nor the names of its
132623SN/A * contributors may be used to endorse or promote products derived from
142623SN/A * this software without specific prior written permission.
152623SN/A *
162623SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172623SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182623SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192623SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202623SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212623SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222623SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232623SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242623SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252623SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262623SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu *
282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi
292623SN/A */
302623SN/A
313170Sstever@eecs.umich.edu#ifndef __BASE_RANGE_MAP_HH__
323806Ssaidi@eecs.umich.edu#define __BASE_RANGE_MAP_HH__
332623SN/A
344040Ssaidi@eecs.umich.edu#include "base/range.hh"
352623SN/A
362623SN/A#include <map>
373348Sbinkertn@umich.edu
383348Sbinkertn@umich.edutemplate <class T,class V>
394762Snate@binkert.orgclass range_map
402901Ssaidi@eecs.umich.edu{
412623SN/A  private:
422623SN/A    typedef std::map<Range<T>,V> RangeMap;
432623SN/A    RangeMap tree;
442623SN/A
452623SN/A  public:
462623SN/A    typedef typename RangeMap::iterator iterator;
472623SN/A
482623SN/A    template <class U>
492623SN/A    const iterator
502623SN/A    find(const Range<U> &r)
512623SN/A    {
522623SN/A        iterator i;
532623SN/A
542623SN/A        i = tree.upper_bound(r);
552623SN/A
562623SN/A        if (i == tree.begin()) {
572623SN/A            if (i->first.start <= r.end && i->first.end >= r.start)
582623SN/A                return i;
592623SN/A            else
602623SN/A                // Nothing could match, so return end()
612623SN/A                return tree.end();
622623SN/A        }
632856Srdreslin@umich.edu
642856Srdreslin@umich.edu        i--;
652856Srdreslin@umich.edu
662856Srdreslin@umich.edu        if (i->first.start <= r.end && i->first.end >= r.start)
672856Srdreslin@umich.edu            return i;
682856Srdreslin@umich.edu
692856Srdreslin@umich.edu        return tree.end();
702856Srdreslin@umich.edu    }
712856Srdreslin@umich.edu
722856Srdreslin@umich.edu    template <class U>
732623SN/A    bool
742623SN/A    intersect(const Range<U> &r)
752623SN/A    {
762623SN/A        iterator i;
772623SN/A        i = find(r);
782623SN/A        if (i != tree.end())
792680Sktlim@umich.edu            return true;
802680Sktlim@umich.edu        return false;
812623SN/A    }
822623SN/A
832680Sktlim@umich.edu
842623SN/A    template <class U,class W>
852623SN/A    iterator
862623SN/A    insert(const Range<U> &r, const W d)
872623SN/A    {
882623SN/A        if (intersect(r))
893349Sbinkertn@umich.edu            return tree.end();
902623SN/A
913184Srdreslin@umich.edu        return tree.insert(std::make_pair<Range<T>,V>(r, d)).first;
922623SN/A    }
932623SN/A
942623SN/A    size_t
952623SN/A    erase(T k)
963349Sbinkertn@umich.edu    {
972623SN/A        return tree.erase(k);
983310Srdreslin@umich.edu    }
993649Srdreslin@umich.edu
1002623SN/A    void
1012623SN/A    erase(iterator p)
1022623SN/A    {
1033349Sbinkertn@umich.edu        tree.erase(p);
1042623SN/A    }
1053184Srdreslin@umich.edu
1063184Srdreslin@umich.edu    void
1072623SN/A    erase(iterator p, iterator q)
1082623SN/A    {
1092623SN/A        tree.erase(p,q);
1102623SN/A    }
1112623SN/A
1123647Srdreslin@umich.edu    void
1133647Srdreslin@umich.edu    clear()
1143647Srdreslin@umich.edu    {
1153647Srdreslin@umich.edu        tree.erase(tree.begin(), tree.end());
1163647Srdreslin@umich.edu    }
1172626SN/A
1183647Srdreslin@umich.edu    iterator
1192626SN/A    begin()
1202623SN/A    {
1212623SN/A        return tree.begin();
1222623SN/A    }
1232657Ssaidi@eecs.umich.edu
1242623SN/A    iterator
1252623SN/A    end()
1262623SN/A    {
1272623SN/A        return tree.end();
1282623SN/A    }
1294192Sktlim@umich.edu
1304192Sktlim@umich.edu    size_t
1314192Sktlim@umich.edu    size()
1324192Sktlim@umich.edu    {
1334192Sktlim@umich.edu        return tree.size();
1344192Sktlim@umich.edu    }
1354192Sktlim@umich.edu
1364192Sktlim@umich.edu    bool
1374192Sktlim@umich.edu    empty()
1384192Sktlim@umich.edu    {
1394192Sktlim@umich.edu        return tree.empty();
1402623SN/A    }
1412623SN/A};
1422623SN/A
1432623SN/A
1442640Sstever@eecs.umich.edutemplate <class T,class V>
1452623SN/Aclass range_multimap
1462623SN/A{
1472623SN/A  private:
1483647Srdreslin@umich.edu    typedef std::multimap<Range<T>,V> RangeMap;
1493647Srdreslin@umich.edu    RangeMap tree;
1503647Srdreslin@umich.edu
1512663Sstever@eecs.umich.edu  public:
1523170Sstever@eecs.umich.edu    typedef typename RangeMap::iterator iterator;
1534022Sstever@eecs.umich.edu
1542623SN/A    template <class U>
1552623SN/A    std::pair<iterator,iterator> find(const Range<U> &r)
1562663Sstever@eecs.umich.edu    {
1573170Sstever@eecs.umich.edu        iterator i;
1584022Sstever@eecs.umich.edu        iterator j;
1592641Sstever@eecs.umich.edu
1602623SN/A        i = tree.lower_bound(r);
1612623SN/A
1622663Sstever@eecs.umich.edu        if (i == tree.begin()) {
1633170Sstever@eecs.umich.edu          if (i->first.start <= r.end && i->first.end >= r.start)
1644022Sstever@eecs.umich.edu                return std::make_pair<iterator, iterator>(i,i);
1652641Sstever@eecs.umich.edu          else
1664040Ssaidi@eecs.umich.edu            // Nothing could match, so return end()
1674040Ssaidi@eecs.umich.edu            return std::make_pair<iterator, iterator>(tree.end(), tree.end());
1682623SN/A        }
1692623SN/A        i--;
1702623SN/A
1712623SN/A        if (i->first.start <= r.end && i->first.end >= r.start) {
1722623SN/A            // we have at least one match
1732623SN/A            j = i;
1742623SN/A
1752623SN/A            i--;
1762623SN/A            while (i->first.start <= r.end && i->first.end >=
1772623SN/A                    r.start) {
1782915Sktlim@umich.edu                if (i == tree.begin())
1792915Sktlim@umich.edu                    break;
1803177Shsul@eecs.umich.edu                i--;
1813177Shsul@eecs.umich.edu            }
1823145Shsul@eecs.umich.edu            if (i == tree.begin() && i->first.start <= r.end && i->first.end >=
1832623SN/A                                        r.start)
1842623SN/A                return std::make_pair<iterator, iterator>(i,j);
1852623SN/A            i++;
1862623SN/A            return std::make_pair<iterator, iterator>(i,j);
1872623SN/A
1882623SN/A        }
1892623SN/A
1902915Sktlim@umich.edu        return std::make_pair<iterator, iterator>(tree.end(), tree.end());
1912915Sktlim@umich.edu    }
1923177Shsul@eecs.umich.edu
1933145Shsul@eecs.umich.edu    template <class U>
1942915Sktlim@umich.edu    bool
1952915Sktlim@umich.edu    intersect(const Range<U> &r)
1962915Sktlim@umich.edu    {
1972915Sktlim@umich.edu        std::pair<iterator,iterator> p;
1982915Sktlim@umich.edu        p = find(r);
1992915Sktlim@umich.edu        if (p.first != tree.end())
2003324Shsul@eecs.umich.edu            return true;
2014762Snate@binkert.org        return false;
2023324Shsul@eecs.umich.edu    }
2033324Shsul@eecs.umich.edu
2043324Shsul@eecs.umich.edu
2053431Sgblack@eecs.umich.edu    template <class U,class W>
2063495Sktlim@umich.edu    iterator
2073431Sgblack@eecs.umich.edu    insert(const Range<U> &r, const W d)
2083324Shsul@eecs.umich.edu    {
2092915Sktlim@umich.edu        std::pair<iterator,iterator> p;
2102623SN/A        p = find(r);
2112623SN/A        if (p.first->first.start == r.start && p.first->first.end == r.end ||
2122623SN/A                p.first == tree.end())
2132798Sktlim@umich.edu            return tree.insert(std::make_pair<Range<T>,V>(r, d));
2142623SN/A        else
2152798Sktlim@umich.edu            return tree.end();
2162798Sktlim@umich.edu    }
2172623SN/A
2182798Sktlim@umich.edu    size_t
2192623SN/A    erase(T k)
2202623SN/A    {
2212623SN/A        return tree.erase(k);
2222623SN/A    }
2232623SN/A
2242623SN/A    void
2254192Sktlim@umich.edu    erase(iterator p)
2262623SN/A    {
2272623SN/A        tree.erase(p);
2282623SN/A    }
2292680Sktlim@umich.edu
2302623SN/A    void
2312680Sktlim@umich.edu    erase(iterator p, iterator q)
2322680Sktlim@umich.edu    {
2332680Sktlim@umich.edu        tree.erase(p,q);
2342623SN/A    }
2353495Sktlim@umich.edu
2362623SN/A    void
2372623SN/A    clear()
2382623SN/A    {
2393512Sktlim@umich.edu        tree.erase(tree.begin(), tree.end());
2403512Sktlim@umich.edu    }
2413512Sktlim@umich.edu
2422623SN/A    iterator
2432623SN/A    begin()
2442623SN/A    {
2452623SN/A        return tree.begin();
2462623SN/A    }
2472623SN/A
2482623SN/A    iterator
2492683Sktlim@umich.edu    end()
2502623SN/A    {
2512623SN/A        return tree.end();
2522623SN/A    }
2532623SN/A
2542623SN/A    size_t
2553686Sktlim@umich.edu    size()
2563430Sgblack@eecs.umich.edu    {
2573495Sktlim@umich.edu        return tree.size();
2582623SN/A    }
2592623SN/A
2602623SN/A    bool
2612623SN/A    empty()
2622623SN/A    {
2632623SN/A        return tree.empty();
2642623SN/A    }
2652623SN/A};
2662683Sktlim@umich.edu
2672623SN/A#endif //__BASE_RANGE_MAP_HH__
2682623SN/A