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