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