Kód Ext limited
Z CHWiki
Obsah |
[editovat] ext::limited
ext::limited je šablona nesoucí jednu hodnotu instanciačního typu, přičemž omezuje modifikace této proměnné tak, aby její hodnota zůstala v nastavených mezích.
Implementovány jsou inkrementace, dekrementace, přičítání a odečítání.
[editovat] Použití
Syntaxe:
ext::limited <typ, dolni_mez, horni_mez> promenna;
Definice čísla, jehož hodnota bude v rozsahu 100 až 200 (včetně):
typedef ext::limited <int, 100, 200> specialni_int;
Definice bajtového typu, který ovšem nepřetéká:
typedef ext::limited <unsigned char, 0, 255> strong_byte_type;
[editovat] Zdrojový kód
[limited]
#ifndef EXT_LIMITED
#define EXT_LIMITED
namespace ext {
// ext::limited <base_integral_pod_type, lower_bound, upper_bound>
template <typename T, T _lo, T _hi>
class limited {
private:
T value;
public:
limited ();
limited (const T&);
operator T () const;
const limited & operator ++ ();
const limited & operator -- ();
const T operator ++ (int);
const T operator -- (int);
limited & operator += (const T & b);
limited & operator -= (const T & b);
};
template <typename T, T _lo, T _hi>
limited <T, _lo, _hi>::limited () : value (_lo) {};
template <typename T, T _lo, T _hi>
limited <T, _lo, _hi>::limited (const T& v)
: value (v < _lo ? _lo : v > _hi ? _hi : v) {};
template <typename T, T _lo, T _hi>
limited <T, _lo, _hi>::operator T () const { return this->value; };
template <typename T, T _lo, T _hi>
const limited<T, _lo, _hi> & limited <T, _lo, _hi>::operator ++ () {
if (this->value != _hi)
++this->value;
return *this;
};
template <typename T, T _lo, T _hi>
const limited<T, _lo, _hi> & limited <T, _lo, _hi>::operator -- () {
if (this->value != _lo)
--this->value;
return *this;
};
template <typename T, T _lo, T _hi>
const T limited <T, _lo, _hi>::operator ++ (int) {
T val = this->value;
this->operator ++ ();
return val;
};
template <typename T, T _lo, T _hi>
const T limited <T, _lo, _hi>::operator -- (int) {
T val = this->value;
this->operator -- ();
return val;
};
template <typename T, T _lo, T _hi>
limited<T, _lo, _hi> & limited <T, _lo, _hi>::operator += (const T & b) {
if (b < 0)
this->operator -= (-b);
else
if (_hi - this->value > b)
this->value += b;
else
this->value = _hi;
return *this;
};
template <typename T, T _lo, T _hi>
limited<T, _lo, _hi> & limited <T, _lo, _hi>::operator -= (const T & b) {
if (b < 0)
this->operator += (-b);
else
if (_lo + this->value > b)
this->value -= b;
else
this->value = _lo;
return *this;
};
};
#endif
[editovat] Poznámky
- "operator T () const;" by možná měl znít "operator const T& () const;"
