00001 #ifndef _RANGED_NUMBER_H
00002 #define _RANGED_NUMBER_H
00003
00004 #include "numbers.h"
00005
00006 namespace luma
00007 {
00008 namespace numbers
00009 {
00010
00031 template <class T>
00032 class RangedNumber
00033 {
00034 protected:
00035 T mValue;
00036 T mMin;
00037 T mMax;
00038 T mIncrement;
00039
00040 public:
00059 RangedNumber(T value, T min, T max, T increment);
00060
00061 virtual RangedNumber& operator=(const RangedNumber<T>&);
00062 virtual RangedNumber& operator=(const T&);
00063 virtual void setIncrement(const T&);
00064 void setValue(const T& value) { mValue = getValidValue(value);}
00065
00069 void modify(const T& max, const T& min, const T& increment);
00070
00073 RangedNumber(const RangedNumber& other);
00074
00075
00080 virtual ~RangedNumber(){};
00081
00085 virtual operator T() const;
00086
00090
00091
00092
00093
00094
00095
00100 virtual RangedNumber<T>& operator++() = 0;
00101
00102
00107 virtual RangedNumber<T>& operator--() = 0;
00108
00109
00110 virtual void inc(float elapsedTime = 1) = 0;
00111 virtual void dec(float elapsedTime = 1) = 0;
00112
00116 const T& min() const;
00117
00121 const T& max() const;
00122
00126 const T& increment() const;
00127
00128 virtual T getValidValue(const T& value) const = 0;
00129
00133 T getValue() const;
00134 };
00135
00136
00137
00138 template <class T>
00139 RangedNumber<T>::RangedNumber(T value, T min, T max, T increment):
00140 mValue(value),
00141 mMin(min),
00142 mMax(max),
00143 mIncrement(increment)
00144 {
00145 }
00146
00147 template <class T>
00148 RangedNumber<T>::RangedNumber(const RangedNumber& other):
00149 mValue(other.mValue),
00150 mMin(other.mMin),
00151 mMax(other.mMax),
00152 mIncrement(other.mIncrement)
00153 {
00154 }
00155
00156 template <class T>
00157 RangedNumber<T>& RangedNumber<T>::operator=(const RangedNumber<T>& other)
00158 {
00159 modify(other.mMin, other.mMax, other.mIncrement);
00160 mValue = getValidValue(other.mValue);
00161
00162 return *this;
00163 }
00164
00165 template <class T>
00166 RangedNumber<T>& RangedNumber<T>::operator=(const T& value)
00167 {
00168 mValue = getValidValue(value);
00169
00170 return *this;
00171 }
00172
00173 template <class T>
00174 const T& RangedNumber<T>::min() const
00175 {
00176 return mMin;
00177 }
00178
00179 template <class T>
00180 const T& RangedNumber<T>::max() const
00181 {
00182 return mMax;
00183 }
00184
00185 template <class T>
00186 const T& RangedNumber<T>::increment() const
00187 {
00188 return mIncrement;
00189 }
00190
00191 template <class T>
00192 RangedNumber<T>::operator T() const
00193 {
00194 return mValue;
00195 }
00196
00197 template <class T>
00198 void RangedNumber<T>::modify(const T& min, const T& max, const T& increment)
00199 {
00200 mMin = min;
00201 mMax = max;
00202 mIncrement = increment;
00203
00204 mValue = getValidValue(mValue);
00205 }
00206
00207 template <class T>
00208 void RangedNumber<T>::setIncrement(const T& increment)
00209 {
00210 mIncrement = increment;
00211 mValue = getValidValue(mValue);
00212 }
00213
00214 template <class T>
00215 T RangedNumber<T>::getValue() const
00216 {
00217 return mValue;
00218 }
00219
00220 }}
00221 #endif