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