1254721Semaste//===-- VMRange.h -----------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_VMRange_h_
11254721Semaste#define liblldb_VMRange_h_
12254721Semaste
13254721Semaste#include "lldb/lldb-private.h"
14254721Semaste#include <vector>
15254721Semaste
16254721Semastenamespace lldb_private {
17254721Semaste
18254721Semaste//----------------------------------------------------------------------
19254721Semaste// A vm address range. These can represent offsets ranges or actual
20254721Semaste// addresses.
21254721Semaste//----------------------------------------------------------------------
22254721Semasteclass VMRange
23254721Semaste{
24254721Semastepublic:
25254721Semaste
26254721Semaste    typedef std::vector<VMRange> collection;
27254721Semaste    typedef collection::iterator iterator;
28254721Semaste    typedef collection::const_iterator const_iterator;
29254721Semaste
30254721Semaste    VMRange() :
31254721Semaste        m_base_addr(0),
32254721Semaste        m_byte_size(0)
33254721Semaste    {
34254721Semaste    }
35254721Semaste
36254721Semaste    VMRange(lldb::addr_t start_addr, lldb::addr_t end_addr) :
37254721Semaste        m_base_addr(start_addr),
38254721Semaste        m_byte_size(end_addr > start_addr ? end_addr - start_addr : 0)
39254721Semaste    {
40254721Semaste    }
41254721Semaste
42254721Semaste    ~VMRange()
43254721Semaste    {
44254721Semaste    }
45254721Semaste
46254721Semaste    void
47254721Semaste    Clear ()
48254721Semaste    {
49254721Semaste        m_base_addr = 0;
50254721Semaste        m_byte_size = 0;
51254721Semaste    }
52254721Semaste
53254721Semaste    // Set the start and end values
54254721Semaste    void
55254721Semaste    Reset (lldb::addr_t start_addr, lldb::addr_t end_addr)
56254721Semaste    {
57254721Semaste        SetBaseAddress (start_addr);
58254721Semaste        SetEndAddress (end_addr);
59254721Semaste    }
60254721Semaste
61254721Semaste    // Set the start value for the range, and keep the same size
62254721Semaste    void
63254721Semaste    SetBaseAddress (lldb::addr_t base_addr)
64254721Semaste    {
65254721Semaste        m_base_addr = base_addr;
66254721Semaste    }
67254721Semaste
68254721Semaste    void
69254721Semaste    SetEndAddress (lldb::addr_t end_addr)
70254721Semaste    {
71254721Semaste        const lldb::addr_t base_addr = GetBaseAddress();
72254721Semaste        if (end_addr > base_addr)
73254721Semaste            m_byte_size = end_addr - base_addr;
74254721Semaste        else
75254721Semaste            m_byte_size = 0;
76254721Semaste    }
77254721Semaste
78254721Semaste    lldb::addr_t
79254721Semaste    GetByteSize () const
80254721Semaste    {
81254721Semaste        return m_byte_size;
82254721Semaste    }
83254721Semaste
84254721Semaste    void
85254721Semaste    SetByteSize (lldb::addr_t byte_size)
86254721Semaste    {
87254721Semaste        m_byte_size = byte_size;
88254721Semaste    }
89254721Semaste
90254721Semaste    lldb::addr_t
91254721Semaste    GetBaseAddress () const
92254721Semaste    {
93254721Semaste        return m_base_addr;
94254721Semaste    }
95254721Semaste
96254721Semaste    lldb::addr_t
97254721Semaste    GetEndAddress () const
98254721Semaste    {
99254721Semaste        return GetBaseAddress() + m_byte_size;
100254721Semaste    }
101254721Semaste
102254721Semaste    bool
103254721Semaste    IsValid() const
104254721Semaste    {
105254721Semaste        return m_byte_size > 0;
106254721Semaste    }
107254721Semaste
108254721Semaste    bool
109254721Semaste    Contains (lldb::addr_t addr) const
110254721Semaste    {
111254721Semaste        return (GetBaseAddress() <= addr) && (addr < GetEndAddress());
112254721Semaste    }
113254721Semaste
114254721Semaste    bool
115254721Semaste    Contains (const VMRange& range) const
116254721Semaste    {
117254721Semaste        if (Contains(range.GetBaseAddress()))
118254721Semaste        {
119254721Semaste            lldb::addr_t range_end = range.GetEndAddress();
120254721Semaste            return (GetBaseAddress() <= range_end) && (range_end <= GetEndAddress());
121254721Semaste        }
122254721Semaste        return false;
123254721Semaste    }
124254721Semaste
125254721Semaste    void
126254721Semaste    Dump (Stream *s, lldb::addr_t base_addr = 0, uint32_t addr_width = 8) const;
127254721Semaste
128254721Semaste    class ValueInRangeUnaryPredicate
129254721Semaste    {
130254721Semaste    public:
131254721Semaste        ValueInRangeUnaryPredicate(lldb::addr_t value) :
132254721Semaste            _value(value)
133254721Semaste        {
134254721Semaste        }
135254721Semaste        bool operator()(const VMRange& range) const
136254721Semaste        {
137254721Semaste            return range.Contains(_value);
138254721Semaste        }
139254721Semaste        lldb::addr_t _value;
140254721Semaste    };
141254721Semaste
142254721Semaste    class RangeInRangeUnaryPredicate
143254721Semaste    {
144254721Semaste    public:
145254721Semaste        RangeInRangeUnaryPredicate(VMRange range) :
146254721Semaste            _range(range)
147254721Semaste        {
148254721Semaste        }
149254721Semaste        bool operator()(const VMRange& range) const
150254721Semaste        {
151254721Semaste            return range.Contains(_range);
152254721Semaste        }
153254721Semaste        const VMRange& _range;
154254721Semaste    };
155254721Semaste
156254721Semaste    static bool
157254721Semaste    ContainsValue(const VMRange::collection& coll, lldb::addr_t value);
158254721Semaste
159254721Semaste    static bool
160254721Semaste    ContainsRange(const VMRange::collection& coll, const VMRange& range);
161254721Semaste
162254721Semaste    // Returns a valid index into coll when a match is found, else UINT32_MAX
163254721Semaste    // is returned
164254721Semaste    static size_t
165254721Semaste    FindRangeIndexThatContainsValue (const VMRange::collection& coll, lldb::addr_t value);
166254721Semaste
167254721Semasteprotected:
168254721Semaste    lldb::addr_t m_base_addr;
169254721Semaste    lldb::addr_t m_byte_size;
170254721Semaste};
171254721Semaste
172254721Semastebool operator== (const VMRange& lhs, const VMRange& rhs);
173254721Semastebool operator!= (const VMRange& lhs, const VMRange& rhs);
174254721Semastebool operator<  (const VMRange& lhs, const VMRange& rhs);
175254721Semastebool operator<= (const VMRange& lhs, const VMRange& rhs);
176254721Semastebool operator>  (const VMRange& lhs, const VMRange& rhs);
177254721Semastebool operator>= (const VMRange& lhs, const VMRange& rhs);
178254721Semaste
179254721Semaste} // namespace lldb_private
180254721Semaste
181254721Semaste#endif  // liblldb_VMRange_h_
182