resiter1.hh
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef __resiter1_hh__
  2. #define __resiter1_hh__
  3. #include <iterator>
  4. using namespace std;
  5. #include "defs.h"
  6. #include "row1.hh"
  7. //--------------------------------------------------------------------------
  8. template <class OnType, class ReturnType, class SizeType, class DiffType>
  9. class subscript_iterator;
  10. //: A container adapter to make a container into a Random Access Container.
  11. // The requirements are that the container has the member functions
  12. // *operator[] (SizeType)* _and_  *size()* defined.
  13. //---------------------------------------------------------------------------
  14. template <class OnType, class ValueType, class ReturnType = const ValueType&, class SizeType = unsigned int, class DiffType = int>
  15. class const_subscript_container
  16. {
  17. public:
  18.   typedef const_subscript_container<OnType,ValueType,ReturnType,SizeType,DiffType>
  19.                                     this_type; //:
  20.   typedef subscript_iterator<const this_type, ReturnType, SizeType, DiffType>
  21.                                                  iterator;   //:
  22.   typedef iterator   const_iterator; //:
  23.   typedef const std::reverse_iterator<iterator, ValueType>       reverse_iterator; //:
  24.   typedef const std::reverse_iterator<const_iterator, ValueType> const_reverse_iterator; //:
  25.   typedef ValueType   value_type; //:
  26.   typedef value_type& reference;  //:
  27.   typedef value_type& const_reference; //:
  28.   typedef value_type* pointer; //:
  29.   typedef value_type* const_pointer; //:
  30.   typedef DiffType          difference_type; //:
  31.   typedef SizeType          size_type; //:
  32.   //---------------------------------------------
  33.   virtual size_type  size() const = 0; //:
  34.   virtual ReturnType operator[] (SizeType i) const = 0; //:
  35.   size_type max_size() const {return size();}    //:
  36.   bool      empty()    const {return size()==0;} //:
  37.   iterator  begin() const {return iterator(this, 0);}      //:
  38.   iterator  end()   const {return iterator(this, size());} //:
  39.   reverse_iterator rbegin() const {return reverse_iterator(end());}   //:
  40.   reverse_iterator rend()   const {return reverse_iterator(begin());} //:
  41. };
  42. //-------------------------------------------------------------------------
  43. template <class OnType, class ReturnType, class SizeType, class DiffType>
  44. class subscript_iterator : public iterator<random_access_iterator_tag, ReturnType, SizeType>
  45. {
  46. private:
  47.   SizeType    i;
  48.   OnType     *d;
  49. public:
  50.   subscript_iterator() {};
  51.   subscript_iterator(OnType *what, SizeType pos) {d=what; i=pos;}
  52.  
  53.   bool operator == (const subscript_iterator &j) const
  54.     {if (d == j.d && i==j.i) return true; return false;}
  55.   bool operator != (const subscript_iterator &j) const
  56.     {if (d == j.d && i!=j.i) return true; return false;}
  57.   bool operator < (const subscript_iterator &j) const
  58.     {if (d == j.d && i < j.i) return true; return false;}
  59.   bool operator > (const subscript_iterator &j) const
  60.     {if (d == j.d && i > j.i) return true; return false;}
  61.   bool operator <= (const subscript_iterator &j) const
  62.     {if (d == j.d && i<=j.i) return true; return false;}
  63.   bool operator >= (const subscript_iterator &j) const
  64.     {if (d == j.d && i>=j.i) return true; return false;}
  65.   ReturnType* operator ->() const  {return &((*d)[i]);}
  66.   ReturnType operator *  () const {return (*d)[i];}
  67.   ReturnType operator [] (SizeType n) const {return (*d)[n];}
  68.   subscript_iterator& operator ++ () {i++; return *this;}
  69.   subscript_iterator  operator ++ (int) 
  70.     {subscript_iterator tmp = *this; i++; return tmp;}
  71.   subscript_iterator& operator -- () {i--; return *this;}
  72.   subscript_iterator  operator -- (int) 
  73.     {subscript_iterator tmp = *this; i--; return tmp;}
  74.   subscript_iterator& operator += (SizeType n) {i=i+n; return *this;}
  75.   subscript_iterator  operator + (SizeType n) const
  76.     {subscript_iterator tmp = *this; tmp.i+=n; return tmp;}
  77.   subscript_iterator& operator -= (SizeType n) {i=i-n; return *this;}
  78.   subscript_iterator  operator - (SizeType n) const
  79.     {subscript_iterator tmp = *this; tmp.i-=n; return tmp;}
  80.   DiffType operator - (const subscript_iterator &j) const
  81.     {if (d == j.d) return (SizeType)i - j.i; return 0;}
  82. };
  83. //-------------------------------------------------------------------------
  84. template <class OnType, class ReturnType, class SizeType, class DiffType>
  85. inline subscript_iterator<OnType,ReturnType,SizeType,DiffType> operator + 
  86. (SizeType x, const subscript_iterator <OnType,ReturnType,SizeType,DiffType>& y) 
  87. {
  88.   return y + x;
  89. }
  90. //------------------------------------------------------------------------
  91. #endif