Kód Ext limited

Z CHWiki

Přejít na: navigace, hledání

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;"