RangeMap.h revision 257663e753af15633e48c7b00eb7b5880168090b
1257663e753af15633e48c7b00eb7b5880168090bGreg Clayton//===-- RangeMap.h ----------------------------------------------*- C++ -*-===// 2257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// 3257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// The LLVM Compiler Infrastructure 4257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// 5257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// This file is distributed under the University of Illinois Open Source 6257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// License. See LICENSE.TXT for details. 7257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// 8257663e753af15633e48c7b00eb7b5880168090bGreg Clayton//===----------------------------------------------------------------------===// 9257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 10257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#ifndef liblldb_RangeMap_h_ 11257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#define liblldb_RangeMap_h_ 12257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 13257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#include "lldb/lldb-private.h" 14257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#include <vector> 15257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 16257663e753af15633e48c7b00eb7b5880168090bGreg Claytonnamespace lldb_private { 17257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 18257663e753af15633e48c7b00eb7b5880168090bGreg Clayton//---------------------------------------------------------------------- 19257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// A vm address range. These can represent offsets ranges or actual 20257663e753af15633e48c7b00eb7b5880168090bGreg Clayton// addresses. 21257663e753af15633e48c7b00eb7b5880168090bGreg Clayton//---------------------------------------------------------------------- 22257663e753af15633e48c7b00eb7b5880168090bGreg Claytontemplate <typename B, typename S, class T> 23257663e753af15633e48c7b00eb7b5880168090bGreg Claytonclass RangeMap 24257663e753af15633e48c7b00eb7b5880168090bGreg Clayton{ 25257663e753af15633e48c7b00eb7b5880168090bGreg Claytonpublic: 26257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typedef B RangeBaseType; 27257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typedef S RangeSizeType; 28257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typedef T EntryDataType; 29257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 30257663e753af15633e48c7b00eb7b5880168090bGreg Clayton struct Range 31257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 32257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeBaseType base; 33257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeSizeType size; 34257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 35257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Range () : 36257663e753af15633e48c7b00eb7b5880168090bGreg Clayton base (0), 37257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size (0) 38257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 39257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 40257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 41257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Range (RangeBaseType b, RangeSizeType s) : 42257663e753af15633e48c7b00eb7b5880168090bGreg Clayton base (b), 43257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size (s) 44257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 45257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 46257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 47257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // Set the start value for the range, and keep the same size 48257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeBaseType 49257663e753af15633e48c7b00eb7b5880168090bGreg Clayton GetBase () const 50257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 51257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return base; 52257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 53257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 54257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 55257663e753af15633e48c7b00eb7b5880168090bGreg Clayton SetBase (RangeBaseType b) 56257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 57257663e753af15633e48c7b00eb7b5880168090bGreg Clayton base = b; 58257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 59257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 60257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeBaseType 61257663e753af15633e48c7b00eb7b5880168090bGreg Clayton GetEnd () const 62257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 63257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return base + size; 64257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 65257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 66257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 67257663e753af15633e48c7b00eb7b5880168090bGreg Clayton SetEnd (RangeBaseType end) 68257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 69257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (end > base) 70257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size = end - base; 71257663e753af15633e48c7b00eb7b5880168090bGreg Clayton else 72257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size = 0; 73257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 74257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 75257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeSizeType 76257663e753af15633e48c7b00eb7b5880168090bGreg Clayton GetSize () const 77257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 78257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return size; 79257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 80257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 81257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 82257663e753af15633e48c7b00eb7b5880168090bGreg Clayton SetSize (RangeSizeType s) 83257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 84257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size = s; 85257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 86257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 87257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 88257663e753af15633e48c7b00eb7b5880168090bGreg Clayton IsValid() const 89257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 90257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return size > 0; 91257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 92257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 93257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 94257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Contains (RangeBaseType r) const 95257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 96257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return (GetBase() <= r) && (r < GetEnd()); 97257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 98257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 99257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 100257663e753af15633e48c7b00eb7b5880168090bGreg Clayton ContainsEndInclusive (RangeBaseType r) const 101257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 102257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return (GetBase() <= r) && (r <= GetEnd()); 103257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 104257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 105257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 106257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Contains (const Range& range) const 107257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 108257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return Contains(range.GetBase()) && ContainsEndInclusive(range.GetEnd()); 109257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 110257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 111257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 112257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator < (const Range &rhs) 113257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 114257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (base == rhs.base) 115257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return size < rhs.size; 116257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return base < rhs.base; 117257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 118257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 119257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 120257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator == (const Range &rhs) 121257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 122257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return base == rhs.base && size == rhs.size; 123257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 124257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 125257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 126257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator != (const Range &rhs) 127257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 128257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return base != rhs.base || size != rhs.size; 129257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 130257663e753af15633e48c7b00eb7b5880168090bGreg Clayton }; 131257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 132257663e753af15633e48c7b00eb7b5880168090bGreg Clayton struct Entry 133257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 134257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Range range; 135257663e753af15633e48c7b00eb7b5880168090bGreg Clayton EntryDataType data; 136257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 137257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Entry () : 138257663e753af15633e48c7b00eb7b5880168090bGreg Clayton range (), 139257663e753af15633e48c7b00eb7b5880168090bGreg Clayton data () 140257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 141257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 142257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 143257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Entry (RangeBaseType base, RangeSizeType size, EntryDataType d) : 144257663e753af15633e48c7b00eb7b5880168090bGreg Clayton range (base, size), 145257663e753af15633e48c7b00eb7b5880168090bGreg Clayton data (d) 146257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 147257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 148257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 149257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 150257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator < (const Entry &rhs) const 151257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 152257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const RangeBaseType lhs_base = range.GetBase(); 153257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const RangeBaseType rhs_base = rhs.range.GetBase(); 154257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (lhs_base == rhs_base) 155257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 156257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const RangeBaseType lhs_size = range.GetSize(); 157257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const RangeBaseType rhs_size = rhs.range.GetSize(); 158257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (lhs_size == rhs_size) 159257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return data < rhs.data; 160257663e753af15633e48c7b00eb7b5880168090bGreg Clayton else 161257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return lhs_size < rhs_size; 162257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 163257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return lhs_base < rhs_base; 164257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 165257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 166257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 167257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator == (const Entry &rhs) const 168257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 169257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return range.GetBase() == rhs.range.GetBase() && 170257663e753af15633e48c7b00eb7b5880168090bGreg Clayton range.GetSize() == rhs.range.GetSize() && 171257663e753af15633e48c7b00eb7b5880168090bGreg Clayton data == rhs.data; 172257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 173257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 174257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 175257663e753af15633e48c7b00eb7b5880168090bGreg Clayton operator != (const Entry &rhs) const 176257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 177257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return range.GetBase() != rhs.range.GetBase() || 178257663e753af15633e48c7b00eb7b5880168090bGreg Clayton range.GetSize() != rhs.range.GetSize() || 179257663e753af15633e48c7b00eb7b5880168090bGreg Clayton data != rhs.data; 180257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 181257663e753af15633e48c7b00eb7b5880168090bGreg Clayton }; 182257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 183257663e753af15633e48c7b00eb7b5880168090bGreg Clayton RangeMap () 184257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 185257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 186257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 187257663e753af15633e48c7b00eb7b5880168090bGreg Clayton ~RangeMap() 188257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 189257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 190257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 191257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 192257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Append (const Entry &entry) 193257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 194257663e753af15633e48c7b00eb7b5880168090bGreg Clayton m_entries.push_back (entry); 195257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 196257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 197257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 198257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Sort () 199257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 200257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (m_entries.size() > 1) 201257663e753af15633e48c7b00eb7b5880168090bGreg Clayton std::stable_sort (m_entries.begin(), m_entries.end()); 202257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 203257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 204257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 205257663e753af15633e48c7b00eb7b5880168090bGreg Clayton CombineConsecutiveEntriesWithEqualData () 206257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 207257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::iterator pos; 208257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::iterator end; 209257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::iterator prev; 210257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool can_combine = false; 211257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // First we determine if we can combine any of the Entry objects so we 212257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // don't end up allocating and making a new collection for no reason 213257663e753af15633e48c7b00eb7b5880168090bGreg Clayton for (pos = m_entries.begin(), end = m_entries.end(), prev = end; pos != end; prev = pos++) 214257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 215257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (prev != end && prev->data == pos->data) 216257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 217257663e753af15633e48c7b00eb7b5880168090bGreg Clayton can_combine = true; 218257663e753af15633e48c7b00eb7b5880168090bGreg Clayton break; 219257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 220257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 221257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 222257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // We we can combine at least one entry, then we make a new collection 223257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // and populate it accordingly, and then swap it into place. 224257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (can_combine) 225257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 226257663e753af15633e48c7b00eb7b5880168090bGreg Clayton std::vector<Entry> minimal_ranges; 227257663e753af15633e48c7b00eb7b5880168090bGreg Clayton for (pos = m_entries.begin(), end = m_entries.end(), prev = end; pos != end; prev = pos++) 228257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 229257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (prev != end && prev->data == pos->data) 230257663e753af15633e48c7b00eb7b5880168090bGreg Clayton minimal_ranges.back().range.SetEnd (pos->range.GetEnd()); 231257663e753af15633e48c7b00eb7b5880168090bGreg Clayton else 232257663e753af15633e48c7b00eb7b5880168090bGreg Clayton minimal_ranges.push_back (*pos); 233257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 234257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // Use the swap technique in case our new vector is much smaller. 235257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // We must swap when using the STL because std::vector objects never 236257663e753af15633e48c7b00eb7b5880168090bGreg Clayton // release or reduce the memory once it has been allocated/reserved. 237257663e753af15633e48c7b00eb7b5880168090bGreg Clayton m_entries.swap (minimal_ranges); 238257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 239257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 240257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 241257663e753af15633e48c7b00eb7b5880168090bGreg Clayton void 242257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Clear () 243257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 244257663e753af15633e48c7b00eb7b5880168090bGreg Clayton m_entries.clear(); 245257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 246257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 247257663e753af15633e48c7b00eb7b5880168090bGreg Clayton bool 248257663e753af15633e48c7b00eb7b5880168090bGreg Clayton IsEmpty () const 249257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 250257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return m_entries.empty(); 251257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 252257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 253257663e753af15633e48c7b00eb7b5880168090bGreg Clayton size_t 254257663e753af15633e48c7b00eb7b5880168090bGreg Clayton GetNumEntries () const 255257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 256257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return m_entries.size(); 257257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 258257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 259257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const Entry * 260257663e753af15633e48c7b00eb7b5880168090bGreg Clayton GetEntryAtIndex (uint32_t i) const 261257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 262257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if (i<m_entries.size()) 263257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return &m_entries[i]; 264257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return NULL; 265257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 266257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 267257663e753af15633e48c7b00eb7b5880168090bGreg Clayton static bool 268257663e753af15633e48c7b00eb7b5880168090bGreg Clayton BaseLessThan (const Entry& lhs, const Entry& rhs) 269257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 270257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return lhs.range.GetBase() < rhs.range.GetBase(); 271257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 272257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 273257663e753af15633e48c7b00eb7b5880168090bGreg Clayton const Entry * 274257663e753af15633e48c7b00eb7b5880168090bGreg Clayton FindEntryThatContains (RangeBaseType addr) const 275257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 276257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if ( !m_entries.empty() ) 277257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 278257663e753af15633e48c7b00eb7b5880168090bGreg Clayton Entry entry; 279257663e753af15633e48c7b00eb7b5880168090bGreg Clayton entry.range.SetBase(addr); 280257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::const_iterator begin = m_entries.begin(); 281257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::const_iterator end = m_entries.end(); 282257663e753af15633e48c7b00eb7b5880168090bGreg Clayton typename std::vector<Entry>::const_iterator pos = std::lower_bound (begin, end, entry, BaseLessThan); 283257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 284257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if ((pos != end) && (pos->range.GetBase() <= addr && addr < pos->range.GetEnd())) 285257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 286257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return &(*pos); 287257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 288257663e753af15633e48c7b00eb7b5880168090bGreg Clayton else if (pos != begin) 289257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 290257663e753af15633e48c7b00eb7b5880168090bGreg Clayton --pos; 291257663e753af15633e48c7b00eb7b5880168090bGreg Clayton if ((pos->range.GetBase() <= addr) && (addr < pos->range.GetEnd())) 292257663e753af15633e48c7b00eb7b5880168090bGreg Clayton { 293257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return &(*pos); 294257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 295257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 296257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 297257663e753af15633e48c7b00eb7b5880168090bGreg Clayton return NULL; 298257663e753af15633e48c7b00eb7b5880168090bGreg Clayton } 299257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 300257663e753af15633e48c7b00eb7b5880168090bGreg Claytonprotected: 301257663e753af15633e48c7b00eb7b5880168090bGreg Clayton std::vector<Entry> m_entries; 302257663e753af15633e48c7b00eb7b5880168090bGreg Clayton}; 303257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 304257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 305257663e753af15633e48c7b00eb7b5880168090bGreg Clayton} // namespace lldb_private 306257663e753af15633e48c7b00eb7b5880168090bGreg Clayton 307257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#endif // liblldb_RangeMap_h_ 308