annotate src/range.hpp @ 0:add35537fdbb tip

Initial import
author irh <ian.r.hobson@gmail.com>
date Thu, 25 Aug 2011 11:05:55 +0100
parents
children
rev   line source
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