1b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//===--------------------- Range.cpp -----------------------------*- C++ -*-===//
2b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//
3b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//                     The LLVM Compiler Infrastructure
4b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//
5b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata// This file is distributed under the University of Illinois Open Source
6b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata// License. See LICENSE.TXT for details.
7b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//
8b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata//===----------------------------------------------------------------------===//
9b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
10b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata#include "lldb/Utility/Range.h"
11b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
12b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatausing namespace lldb_utility;
13b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
14b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Range (const Range& rng) :
15b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatam_low(rng.m_low),
16b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatam_high(rng.m_high)
17b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
18b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    InitRange();
19b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
20b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
21b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Range (Range::ValueType low,
22b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata              Range::ValueType high) :
23b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatam_low(low),
24b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatam_high(high)
25b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
26b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    InitRange();
27b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
28b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
29b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatavoid
30b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::InitRange ()
31b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
32b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    if (m_low == OPEN_END)
33b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    {
34b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        if (m_high == OPEN_END)
35b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            m_low = 0;
36b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        else
37b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        {
38b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            // make an empty range
39b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            m_low = 1;
40b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            m_high = 0;
41b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        }
42b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    }
43b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
44b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
45b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange&
46b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::operator = (const Range& rhs)
47b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
48b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    if (&rhs != this)
49b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    {
50b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        this->m_low = rhs.m_low;
51b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        this->m_high = rhs.m_high;
52b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    }
53b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    return *this;
54b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
55b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
56b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatavoid
57b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Flip ()
58b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
59b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    std::swap(m_high, m_low);
60b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
61b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
62b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatavoid
63b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Intersection (const Range& other)
64b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
65b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    m_low = std::max(m_low,other.m_low);
66b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    m_high = std::min(m_high,other.m_high);
67b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
68b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
69b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatavoid
70b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Union (const Range& other)
71b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
72b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    m_low = std::min(m_low,other.m_low);
73b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    m_high = std::max(m_high,other.m_high);
74b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
75b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
76b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatavoid
77b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::Iterate (RangeCallback callback)
78b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
79b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    ValueType counter = m_low;
80b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    while (counter <= m_high)
81b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    {
82b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        bool should_continue = callback(counter);
83b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        if (!should_continue)
84b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            return;
85b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        counter++;
86b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    }
87b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
88b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
89b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granatabool
90b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::IsEmpty ()
91b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
92b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    return (m_low > m_high);
93b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
94b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata
95b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::ValueType
96b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico GranataRange::GetSize ()
97b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata{
98b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    if (m_high == OPEN_END)
99b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        return OPEN_END;
100b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    if (m_high >= m_low)
101b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        return m_high - m_low + 1;
102b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata    return 0;
103b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata}
104