1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "TargetAddressRangeList.h"
7
8#include <algorithm>
9
10
11TargetAddressRangeList::TargetAddressRangeList()
12{
13}
14
15
16TargetAddressRangeList::TargetAddressRangeList(const TargetAddressRange& range)
17{
18	AddRange(range);
19}
20
21
22TargetAddressRangeList::TargetAddressRangeList(
23	const TargetAddressRangeList& other)
24	:
25	fRanges(other.fRanges)
26{
27}
28
29
30void
31TargetAddressRangeList::Clear()
32{
33	fRanges.Clear();
34}
35
36
37bool
38TargetAddressRangeList::AddRange(const TargetAddressRange& range)
39{
40	return fRanges.Add(range);
41}
42
43
44int32
45TargetAddressRangeList::CountRanges() const
46{
47	return fRanges.Size();
48}
49
50
51TargetAddressRange
52TargetAddressRangeList::RangeAt(int32 index) const
53{
54	return index >= 0 && index < fRanges.Size()
55		? fRanges[index] : TargetAddressRange();
56}
57
58
59target_addr_t
60TargetAddressRangeList::LowestAddress() const
61{
62	int32 count = fRanges.Size();
63	if (count == 0)
64		return 0;
65
66	target_addr_t lowest = fRanges[0].Start();
67	for (int32 i = 0; i < count; i++)
68		lowest = std::min(lowest, fRanges[i].Start());
69
70	return lowest;
71}
72
73
74TargetAddressRange
75TargetAddressRangeList::CoveringRange() const
76{
77	TargetAddressRange range;
78	int32 count = fRanges.Size();
79	for (int32 i = 0; i < count; i++)
80		range |= fRanges[i];
81
82	return range;
83}
84
85
86bool
87TargetAddressRangeList::Contains(target_addr_t address) const
88{
89	int32 count = fRanges.Size();
90	for (int32 i = 0; i < count; i++) {
91		if (fRanges[i].Contains(address))
92			return true;
93	}
94
95	return false;
96}
97
98
99TargetAddressRangeList&
100TargetAddressRangeList::operator=(const TargetAddressRangeList& other)
101{
102	fRanges = other.fRanges;
103	return *this;
104}
105