ian@0
|
1 // Copyright 2011, Ian Hobson.
|
ian@0
|
2 //
|
ian@0
|
3 // This file is part of gpsynth.
|
ian@0
|
4 //
|
ian@0
|
5 // gpsynth is free software: you can redistribute it and/or modify
|
ian@0
|
6 // it under the terms of the GNU General Public License as published by
|
ian@0
|
7 // the Free Software Foundation, either version 3 of the License, or
|
ian@0
|
8 // (at your option) any later version.
|
ian@0
|
9 //
|
ian@0
|
10 // gpsynth is distributed in the hope that it will be useful,
|
ian@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
ian@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
ian@0
|
13 // GNU General Public License for more details.
|
ian@0
|
14 //
|
ian@0
|
15 // You should have received a copy of the GNU General Public License
|
ian@0
|
16 // along with gpsynth in the file COPYING.
|
ian@0
|
17 // If not, see http://www.gnu.org/licenses/.
|
ian@0
|
18
|
ian@0
|
19 #pragma once
|
ian@0
|
20
|
ian@0
|
21 #include <ostream>
|
ian@0
|
22
|
ian@0
|
23 namespace stdx {
|
ian@0
|
24
|
ian@0
|
25 // like std::pair, designed for minimum/maximum
|
ian@0
|
26 template<typename T>
|
ian@0
|
27 struct Range {
|
ian@0
|
28 T minimum_;
|
ian@0
|
29 T maximum_;
|
ian@0
|
30
|
ian@0
|
31 Range()
|
ian@0
|
32 : minimum_(T()),
|
ian@0
|
33 maximum_(T())
|
ian@0
|
34 {}
|
ian@0
|
35
|
ian@0
|
36 Range(T minimum, T maximum)
|
ian@0
|
37 : minimum_(minimum),
|
ian@0
|
38 maximum_(maximum)
|
ian@0
|
39 {}
|
ian@0
|
40
|
ian@0
|
41 template<typename T2>
|
ian@0
|
42 Range(const Range<T2>& other)
|
ian@0
|
43 : minimum_(other.minimum_),
|
ian@0
|
44 maximum_(other.maximum_)
|
ian@0
|
45 {}
|
ian@0
|
46
|
ian@0
|
47 // getters / setters
|
ian@0
|
48 T Minimum() const { return minimum_; }
|
ian@0
|
49 T Maximum() const { return maximum_; }
|
ian@0
|
50
|
ian@0
|
51 void SetMinimum(const T& value) { minimum_ = value; }
|
ian@0
|
52 void SetMaximum(const T& value) { maximum_ = value; }
|
ian@0
|
53
|
ian@0
|
54 void SetRange(const T& minimum, const T& maximum) {
|
ian@0
|
55 minimum_ = minimum;
|
ian@0
|
56 maximum_ = maximum;
|
ian@0
|
57 }
|
ian@0
|
58
|
ian@0
|
59 T Size() const { return maximum_ - minimum_; }
|
ian@0
|
60
|
ian@0
|
61 // Assignment operators
|
ian@0
|
62 template<typename T2>
|
ian@0
|
63 void operator=(const Range<T2>& other) {
|
ian@0
|
64 minimum_ = other.minumum_;
|
ian@0
|
65 maximum_ = other.maximum_;
|
ian@0
|
66 }
|
ian@0
|
67
|
ian@0
|
68 template<typename T2>
|
ian@0
|
69 Range<T>& operator+=(const Range<T2>& other) {
|
ian@0
|
70 minimum_ += other.minimum_;
|
ian@0
|
71 maximum_ += other.maximum_;
|
ian@0
|
72 return *this;
|
ian@0
|
73 }
|
ian@0
|
74 template<typename T2>
|
ian@0
|
75 Range<T>& operator+=(const T2& value) {
|
ian@0
|
76 minimum_ += value;
|
ian@0
|
77 maximum_ += value;
|
ian@0
|
78 return *this;
|
ian@0
|
79 }
|
ian@0
|
80
|
ian@0
|
81 template<typename T2>
|
ian@0
|
82 Range<T>& operator-=(const Range<T2>& other) {
|
ian@0
|
83 minimum_ -= other.minimum_;
|
ian@0
|
84 maximum_ -= other.maximum_;
|
ian@0
|
85 return *this;
|
ian@0
|
86 }
|
ian@0
|
87 template<typename T2>
|
ian@0
|
88 Range<T>& operator-=(const T2& value) {
|
ian@0
|
89 minimum_ -= value;
|
ian@0
|
90 maximum_ -= value;
|
ian@0
|
91 return *this;
|
ian@0
|
92 }
|
ian@0
|
93
|
ian@0
|
94 template<typename T2>
|
ian@0
|
95 Range<T>& operator*=(const T2& value) {
|
ian@0
|
96 minimum_ *= value;
|
ian@0
|
97 maximum_ *= value;
|
ian@0
|
98 return *this;
|
ian@0
|
99 }
|
ian@0
|
100 template<typename T2>
|
ian@0
|
101 Range<T>& operator/=(const T2& value) {
|
ian@0
|
102 minimum_ /= value;
|
ian@0
|
103 maximum_ /= value;
|
ian@0
|
104 return *this;
|
ian@0
|
105 }
|
ian@0
|
106
|
ian@0
|
107
|
ian@0
|
108 // Arithmetic
|
ian@0
|
109 template<typename T2>
|
ian@0
|
110 Range<T> operator+(const T2& value) {
|
ian@0
|
111 return Range<T>(minimum_ + value, maximum_ + value);
|
ian@0
|
112 }
|
ian@0
|
113 template<typename T2>
|
ian@0
|
114 Range<T> operator+(const Range<T2>& other) {
|
ian@0
|
115 return Range<T>(minimum_ + other.minimum_, maximum_ + other.maximum_);
|
ian@0
|
116 }
|
ian@0
|
117
|
ian@0
|
118 template<typename T2>
|
ian@0
|
119 Range<T> operator-(const T2& value) {
|
ian@0
|
120 return Range<T>(minimum_ - value, maximum_ - value);
|
ian@0
|
121 }
|
ian@0
|
122 template<typename T2>
|
ian@0
|
123 Range<T> operator-(const Range<T2>& other) {
|
ian@0
|
124 return Range<T>(minimum_ - other.minimum_, maximum_ - other.maximum_);
|
ian@0
|
125 }
|
ian@0
|
126
|
ian@0
|
127 template<typename T2>
|
ian@0
|
128 Range<T> operator*(const T2& value) {
|
ian@0
|
129 return Range<T>(minimum_ * value, maximum_ * value);
|
ian@0
|
130 }
|
ian@0
|
131 template<typename T2>
|
ian@0
|
132 Range<T> operator/(const T2& value) {
|
ian@0
|
133 return Range<T>(minimum_ / value, maximum_ / value);
|
ian@0
|
134 }
|
ian@0
|
135
|
ian@0
|
136 // Increments/Decrements
|
ian@0
|
137 Range<T>& operator++() {
|
ian@0
|
138 ++minimum_;
|
ian@0
|
139 ++maximum_;
|
ian@0
|
140 return *this;
|
ian@0
|
141 }
|
ian@0
|
142 Range<T>& operator--() {
|
ian@0
|
143 --minimum_;
|
ian@0
|
144 --maximum_;
|
ian@0
|
145 return *this;
|
ian@0
|
146 }
|
ian@0
|
147
|
ian@0
|
148 Range<T> operator++(int) {
|
ian@0
|
149 Range<T> temp(*this);
|
ian@0
|
150 ++(*this);
|
ian@0
|
151 return temp;
|
ian@0
|
152 }
|
ian@0
|
153 Range<T> operator--(int) {
|
ian@0
|
154 Range<T> temp(*this);
|
ian@0
|
155 --(*this);
|
ian@0
|
156 return temp;
|
ian@0
|
157 }
|
ian@0
|
158
|
ian@0
|
159 };
|
ian@0
|
160
|
ian@0
|
161 // Comparison operators
|
ian@0
|
162 template<typename T>
|
ian@0
|
163 bool operator==(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
164 return (x.minimum_ == y.minimum_) && (x.maximum_ == y.maximum_);
|
ian@0
|
165 }
|
ian@0
|
166
|
ian@0
|
167 template<typename T>
|
ian@0
|
168 bool operator<(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
169 return (x.minimum_ < y.minimum_)
|
ian@0
|
170 || (!(y.minimum_ < x.minimum_) && (x.maximum_ < y.maximum_));
|
ian@0
|
171 }
|
ian@0
|
172
|
ian@0
|
173 template<typename T>
|
ian@0
|
174 bool operator!=(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
175 return !(x == y);
|
ian@0
|
176 }
|
ian@0
|
177
|
ian@0
|
178 template<typename T>
|
ian@0
|
179 bool operator>(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
180 return y < x;
|
ian@0
|
181 }
|
ian@0
|
182
|
ian@0
|
183 template<typename T>
|
ian@0
|
184 bool operator<=(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
185 return !(y < x);
|
ian@0
|
186 }
|
ian@0
|
187
|
ian@0
|
188 template<typename T>
|
ian@0
|
189 bool operator>=(const Range<T>& x, const Range<T>& y) {
|
ian@0
|
190 return !(x < y);
|
ian@0
|
191 }
|
ian@0
|
192
|
ian@0
|
193 // Output
|
ian@0
|
194 template<typename T>
|
ian@0
|
195 std::ostream& operator<<(std::ostream& out, const Range<T>& range) {
|
ian@0
|
196 out << '[' << range.minimum_ << ',' << range.maximum_ << ']';
|
ian@0
|
197 return out;
|
ian@0
|
198 }
|
ian@0
|
199
|
ian@0
|
200 } // stdx namespace
|
ian@0
|
201
|