00001 #ifndef _CLAMPED_NUMBER_H
00002 #define _CLAMPED_NUMBER_H
00003
00004 #include "utils.h"
00005 #include "RangedNumber.h"
00006
00007 namespace luma
00008 {
00009
00010 namespace numbers
00011 {
00012
00026 template <class T>
00027 class ClampedNumber: public RangedNumber<T>
00028 {
00029 protected:
00030 virtual T getValidValue(const T& value) const;
00031 public:
00036 ClampedNumber(T value, T min, T max, T increment);
00037
00042 ClampedNumber(const ClampedNumber<T>& other);
00043
00047
00048
00054 ClampedNumber& operator=(const ClampedNumber<T>& other);
00055
00060 ClampedNumber<T>& operator+=(const T& increment);
00061
00066 ClampedNumber<T>& operator-=(const T& decrement);
00067
00068 virtual ClampedNumber<T>& operator++();
00069 virtual ClampedNumber<T> operator++(int);
00070 virtual ClampedNumber<T>& operator--();
00071 virtual ClampedNumber<T> operator--(int);
00072 virtual void dec(float elapsedTime = 1);
00073 virtual void inc(float elapsedTime = 1);
00074 };
00075
00076 template <class T>
00077 ClampedNumber<T>::ClampedNumber(T value, T min, T max,T increment):
00078 RangedNumber<T>(clamp(value, min, max - increment), min, max, increment)
00079 {
00080 }
00081
00082 template <class T>
00083 ClampedNumber<T>::ClampedNumber(const ClampedNumber<T>& other):
00084 RangedNumber<T>(other)
00085 {}
00086
00087
00088
00089
00090
00091
00092
00093
00094 template <class T>
00095 ClampedNumber<T>& ClampedNumber<T>::operator=(const ClampedNumber<T>& other)
00096 {
00097 return dynamic_cast<ClampedNumber<T>&>(RangedNumber<T>::operator=(other));
00098 }
00099
00100 template <class T>
00101 ClampedNumber<T>& ClampedNumber<T>::operator++()
00102 {
00103 RangedNumber<T>::mValue += RangedNumber<T>::mIncrement;
00104 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::mIncrement);
00105
00106 return *this;
00107 }
00108
00109 template <class T>
00110 ClampedNumber<T> ClampedNumber<T>::operator++(int)
00111 {
00112 ClampedNumber<T> tmp = *this;
00113 ++*this;
00114
00115 return tmp;
00116 }
00117
00118 template <class T>
00119 ClampedNumber<T>& ClampedNumber<T>::operator--()
00120 {
00121 RangedNumber<T>::mValue -= RangedNumber<T>::mIncrement;
00122 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::mIncrement);
00123
00124 return *this;
00125 }
00126
00127 template <class T>
00128 ClampedNumber<T> ClampedNumber<T>::operator--(int)
00129 {
00130 ClampedNumber<T> tmp = *this;
00131 --*this;
00132
00133 return tmp;
00134 }
00135
00136 template <class T>
00137 ClampedNumber<T>& ClampedNumber<T>::operator+=(const T& increment)
00138 {
00139 RangedNumber<T>::mValue += RangedNumber<T>::increment;
00140 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::increment);
00141
00142 return *this;
00143 }
00144
00145 template <class T>
00146 ClampedNumber<T>& ClampedNumber<T>::operator-=(const T& increment)
00147 {
00148 RangedNumber<T>::mValue -= RangedNumber<T>::increment;
00149 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::increment);
00150
00151 return *this;
00152 }
00153
00154 template <class T>
00155 T ClampedNumber<T>::getValidValue(const T& value) const
00156 {
00157 return clamp(value, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::mIncrement);
00158 }
00159
00160 template <class T>
00161 void ClampedNumber<T>::inc(float ellapsedTime)
00162 {
00163 RangedNumber<T>::mValue += (T)(RangedNumber<T>::mIncrement * ellapsedTime * frameRate);
00164 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::mIncrement);
00165 }
00166
00167 template <class T>
00168 void ClampedNumber<T>::dec(float ellapsedTime)
00169 {
00170 RangedNumber<T>::mValue -= (T)(RangedNumber<T>::mIncrement * ellapsedTime * frameRate);
00171 RangedNumber<T>::mValue = clamp(RangedNumber<T>::mValue, RangedNumber<T>::mMin, RangedNumber<T>::mMax - RangedNumber<T>::mIncrement);
00172 }
00173
00174 }}
00175 #endif //_CLAMPED_NUMBER_H