1254721Semaste//===--------------------- Range.cpp -----------------------------*- 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#include "lldb/Utility/Range.h"
11254721Semaste
12254721Semasteusing namespace lldb_utility;
13254721Semaste
14254721SemasteRange::Range (const Range& rng) :
15254721Semastem_low(rng.m_low),
16254721Semastem_high(rng.m_high)
17254721Semaste{
18254721Semaste    InitRange();
19254721Semaste}
20254721Semaste
21254721SemasteRange::Range (Range::ValueType low,
22254721Semaste              Range::ValueType high) :
23254721Semastem_low(low),
24254721Semastem_high(high)
25254721Semaste{
26254721Semaste    InitRange();
27254721Semaste}
28254721Semaste
29254721Semastevoid
30254721SemasteRange::InitRange ()
31254721Semaste{
32254721Semaste    if (m_low == OPEN_END)
33254721Semaste    {
34254721Semaste        if (m_high == OPEN_END)
35254721Semaste            m_low = 0;
36254721Semaste        else
37254721Semaste        {
38254721Semaste            // make an empty range
39254721Semaste            m_low = 1;
40254721Semaste            m_high = 0;
41254721Semaste        }
42254721Semaste    }
43254721Semaste}
44254721Semaste
45254721SemasteRange&
46254721SemasteRange::operator = (const Range& rhs)
47254721Semaste{
48254721Semaste    if (&rhs != this)
49254721Semaste    {
50254721Semaste        this->m_low = rhs.m_low;
51254721Semaste        this->m_high = rhs.m_high;
52254721Semaste    }
53254721Semaste    return *this;
54254721Semaste}
55254721Semaste
56254721Semastevoid
57254721SemasteRange::Flip ()
58254721Semaste{
59254721Semaste    std::swap(m_high, m_low);
60254721Semaste}
61254721Semaste
62254721Semastevoid
63254721SemasteRange::Intersection (const Range& other)
64254721Semaste{
65254721Semaste    m_low = std::max(m_low,other.m_low);
66254721Semaste    m_high = std::min(m_high,other.m_high);
67254721Semaste}
68254721Semaste
69254721Semastevoid
70254721SemasteRange::Union (const Range& other)
71254721Semaste{
72254721Semaste    m_low = std::min(m_low,other.m_low);
73254721Semaste    m_high = std::max(m_high,other.m_high);
74254721Semaste}
75254721Semaste
76254721Semastevoid
77254721SemasteRange::Iterate (RangeCallback callback)
78254721Semaste{
79254721Semaste    ValueType counter = m_low;
80254721Semaste    while (counter <= m_high)
81254721Semaste    {
82254721Semaste        bool should_continue = callback(counter);
83254721Semaste        if (!should_continue)
84254721Semaste            return;
85254721Semaste        counter++;
86254721Semaste    }
87254721Semaste}
88254721Semaste
89254721Semastebool
90254721SemasteRange::IsEmpty ()
91254721Semaste{
92254721Semaste    return (m_low > m_high);
93254721Semaste}
94254721Semaste
95254721SemasteRange::ValueType
96254721SemasteRange::GetSize ()
97254721Semaste{
98254721Semaste    if (m_high == OPEN_END)
99254721Semaste        return OPEN_END;
100254721Semaste    if (m_high >= m_low)
101254721Semaste        return m_high - m_low + 1;
102254721Semaste    return 0;
103254721Semaste}
104