ian@0: // Copyright 2011, Ian Hobson. ian@0: // ian@0: // This file is part of gpsynth. ian@0: // ian@0: // gpsynth is free software: you can redistribute it and/or modify ian@0: // it under the terms of the GNU General Public License as published by ian@0: // the Free Software Foundation, either version 3 of the License, or ian@0: // (at your option) any later version. ian@0: // ian@0: // gpsynth is distributed in the hope that it will be useful, ian@0: // but WITHOUT ANY WARRANTY; without even the implied warranty of ian@0: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ian@0: // GNU General Public License for more details. ian@0: // ian@0: // You should have received a copy of the GNU General Public License ian@0: // along with gpsynth in the file COPYING. ian@0: // If not, see http://www.gnu.org/licenses/. ian@0: ian@0: #pragma once ian@0: ian@0: #include ian@0: ian@0: namespace stdx { ian@0: ian@0: // like std::pair, designed for minimum/maximum ian@0: template ian@0: struct Range { ian@0: T minimum_; ian@0: T maximum_; ian@0: ian@0: Range() ian@0: : minimum_(T()), ian@0: maximum_(T()) ian@0: {} ian@0: ian@0: Range(T minimum, T maximum) ian@0: : minimum_(minimum), ian@0: maximum_(maximum) ian@0: {} ian@0: ian@0: template ian@0: Range(const Range& other) ian@0: : minimum_(other.minimum_), ian@0: maximum_(other.maximum_) ian@0: {} ian@0: ian@0: // getters / setters ian@0: T Minimum() const { return minimum_; } ian@0: T Maximum() const { return maximum_; } ian@0: ian@0: void SetMinimum(const T& value) { minimum_ = value; } ian@0: void SetMaximum(const T& value) { maximum_ = value; } ian@0: ian@0: void SetRange(const T& minimum, const T& maximum) { ian@0: minimum_ = minimum; ian@0: maximum_ = maximum; ian@0: } ian@0: ian@0: T Size() const { return maximum_ - minimum_; } ian@0: ian@0: // Assignment operators ian@0: template ian@0: void operator=(const Range& other) { ian@0: minimum_ = other.minumum_; ian@0: maximum_ = other.maximum_; ian@0: } ian@0: ian@0: template ian@0: Range& operator+=(const Range& other) { ian@0: minimum_ += other.minimum_; ian@0: maximum_ += other.maximum_; ian@0: return *this; ian@0: } ian@0: template ian@0: Range& operator+=(const T2& value) { ian@0: minimum_ += value; ian@0: maximum_ += value; ian@0: return *this; ian@0: } ian@0: ian@0: template ian@0: Range& operator-=(const Range& other) { ian@0: minimum_ -= other.minimum_; ian@0: maximum_ -= other.maximum_; ian@0: return *this; ian@0: } ian@0: template ian@0: Range& operator-=(const T2& value) { ian@0: minimum_ -= value; ian@0: maximum_ -= value; ian@0: return *this; ian@0: } ian@0: ian@0: template ian@0: Range& operator*=(const T2& value) { ian@0: minimum_ *= value; ian@0: maximum_ *= value; ian@0: return *this; ian@0: } ian@0: template ian@0: Range& operator/=(const T2& value) { ian@0: minimum_ /= value; ian@0: maximum_ /= value; ian@0: return *this; ian@0: } ian@0: ian@0: ian@0: // Arithmetic ian@0: template ian@0: Range operator+(const T2& value) { ian@0: return Range(minimum_ + value, maximum_ + value); ian@0: } ian@0: template ian@0: Range operator+(const Range& other) { ian@0: return Range(minimum_ + other.minimum_, maximum_ + other.maximum_); ian@0: } ian@0: ian@0: template ian@0: Range operator-(const T2& value) { ian@0: return Range(minimum_ - value, maximum_ - value); ian@0: } ian@0: template ian@0: Range operator-(const Range& other) { ian@0: return Range(minimum_ - other.minimum_, maximum_ - other.maximum_); ian@0: } ian@0: ian@0: template ian@0: Range operator*(const T2& value) { ian@0: return Range(minimum_ * value, maximum_ * value); ian@0: } ian@0: template ian@0: Range operator/(const T2& value) { ian@0: return Range(minimum_ / value, maximum_ / value); ian@0: } ian@0: ian@0: // Increments/Decrements ian@0: Range& operator++() { ian@0: ++minimum_; ian@0: ++maximum_; ian@0: return *this; ian@0: } ian@0: Range& operator--() { ian@0: --minimum_; ian@0: --maximum_; ian@0: return *this; ian@0: } ian@0: ian@0: Range operator++(int) { ian@0: Range temp(*this); ian@0: ++(*this); ian@0: return temp; ian@0: } ian@0: Range operator--(int) { ian@0: Range temp(*this); ian@0: --(*this); ian@0: return temp; ian@0: } ian@0: ian@0: }; ian@0: ian@0: // Comparison operators ian@0: template ian@0: bool operator==(const Range& x, const Range& y) { ian@0: return (x.minimum_ == y.minimum_) && (x.maximum_ == y.maximum_); ian@0: } ian@0: ian@0: template ian@0: bool operator<(const Range& x, const Range& y) { ian@0: return (x.minimum_ < y.minimum_) ian@0: || (!(y.minimum_ < x.minimum_) && (x.maximum_ < y.maximum_)); ian@0: } ian@0: ian@0: template ian@0: bool operator!=(const Range& x, const Range& y) { ian@0: return !(x == y); ian@0: } ian@0: ian@0: template ian@0: bool operator>(const Range& x, const Range& y) { ian@0: return y < x; ian@0: } ian@0: ian@0: template ian@0: bool operator<=(const Range& x, const Range& y) { ian@0: return !(y < x); ian@0: } ian@0: ian@0: template ian@0: bool operator>=(const Range& x, const Range& y) { ian@0: return !(x < y); ian@0: } ian@0: ian@0: // Output ian@0: template ian@0: std::ostream& operator<<(std::ostream& out, const Range& range) { ian@0: out << '[' << range.minimum_ << ',' << range.maximum_ << ']'; ian@0: return out; ian@0: } ian@0: ian@0: } // stdx namespace ian@0: