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