ReverseIterator.Base.tlh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #pragma once
  2. #include <iterator>
  3. //-----------------------------------------------------------------------------
  4. // BaseIterator
  5. // 迭代器的基本类
  6. //-----------------------------------------------------------------------------
  7. namespace ReverseIterator
  8. {
  9. template <typename IterType> class __BaseIterator
  10. {
  11. public:
  12. // 构造一个全空的迭代器, 用于容器指针为空的情形
  13. __BaseIterator ()
  14. {
  15. m_Count = -1;
  16. m_Index = 0;
  17. }
  18. __BaseIterator (const __BaseIterator & from)
  19. {
  20. CopyAssign (from);
  21. }
  22. __BaseIterator (__BaseIterator && from)
  23. {
  24. MoveAssign (from);
  25. }
  26. ~__BaseIterator () {}
  27. public:
  28. inline __BaseIterator & operator = (const __BaseIterator & from)
  29. {
  30. CopyAssign (from);
  31. return (*this);
  32. }
  33. public:
  34. // inline operator bool () const { return (m_Index >= 0) && (m_Index < m_Count); }
  35. // inline operator bool () const { return (Iter._Ptr != nullptr) && (Iter != _end); }
  36. inline operator bool () const { return (m_Count > 0) && (Iter != _end); }
  37. inline int Index () const { return m_Index; }
  38. inline int Count () const { return m_Count; }
  39. inline void Next ()
  40. {
  41. if (m_Index >= 0)
  42. {
  43. ++ Iter;
  44. -- m_Index;
  45. }
  46. }
  47. inline void operator ++ () // ++ Iter;
  48. {
  49. Next ();
  50. }
  51. inline void operator ++ (int) // Iter ++;
  52. {
  53. Next ();
  54. }
  55. inline void Prev ()
  56. {
  57. if (m_Index > 0)
  58. {
  59. -- Iter;
  60. ++ m_Index;
  61. }
  62. else
  63. {
  64. Iter = _end;
  65. m_Index = -1;
  66. }
  67. }
  68. inline void operator -- () // -- Iter;
  69. {
  70. Prev ();
  71. }
  72. inline void operator -- (int) // Iter --;
  73. {
  74. Prev ();
  75. }
  76. public:
  77. inline void Restart ()
  78. {
  79. Iter = _begin;
  80. m_Index = m_Count - 1;
  81. }
  82. protected:
  83. inline void CopyAssign (const __BaseIterator & from)
  84. {
  85. Iter = from.Iter;
  86. _begin = from._begin;
  87. _end = from._end;
  88. m_Count = from.m_Count;
  89. m_Index = from.m_Index;
  90. }
  91. inline void MoveAssign (__BaseIterator & from)
  92. {
  93. Iter = from.Iter;
  94. _begin = from._begin;
  95. _end = from._end;
  96. m_Count = from.m_Count;
  97. m_Index = from.m_Index;
  98. from.Iter = from._begin = from._end;
  99. from.m_Count = 0;
  100. from.m_Index = 0;
  101. }
  102. protected:
  103. typename IterType Iter;
  104. typename IterType _begin;
  105. typename IterType _end;
  106. int m_Count;
  107. int m_Index;
  108. };
  109. }