Iterator.Zip.tlh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #pragma once
  2. #include <tuple>
  3. #include "Iterator.Base.tlh"
  4. //-----------------------------------------------------------------------------
  5. // Zip_Iterator
  6. //
  7. // 注意:
  8. // 返回的 tuple 的数据类型应该是直接类型, 不能是引用类型
  9. // (比如应该是 tuple <int, DString>, 不应该是 tuple <int &, DString &>)
  10. // 所以这里 data_type = value_type
  11. //-----------------------------------------------------------------------------
  12. namespace Iterator
  13. {
  14. template <typename IteratorA, typename IteratorB>
  15. class Zip_Iterator2 : public __CoreIterator
  16. {
  17. typedef __CoreIterator inherited;
  18. public:
  19. using IterType = typename IteratorA::IterType;
  20. using value_type_A = typename IteratorA::value_type;
  21. using value_type_B = typename IteratorB::value_type;
  22. using data_type_A = typename IteratorA::data_type;
  23. using data_type_B = typename IteratorB::data_type;
  24. using value_type = std::tuple <value_type_A, value_type_B>;
  25. // using data_type = std::tuple <data_type_A, data_type_B>;
  26. using data_type = value_type;
  27. using deref_type = value_type;
  28. public:
  29. Zip_Iterator2 () = delete;
  30. Zip_Iterator2 (IteratorA & a, IteratorB & b) :
  31. m_IterA (a),
  32. m_IterB (b),
  33. inherited (a)
  34. {
  35. }
  36. Zip_Iterator2 (const Zip_Iterator2 & from) :
  37. m_IterA (from.m_IterA),
  38. m_IterB (from.m_IterB),
  39. inherited (from.m_IterA)
  40. {
  41. }
  42. Zip_Iterator2 (Zip_Iterator2 && from) :
  43. m_IterA (from.m_IterA),
  44. m_IterB (from.m_IterB),
  45. inherited (from.m_IterA)
  46. {
  47. }
  48. public:
  49. inline virtual void Next () override
  50. {
  51. if (! IsEmpty ())
  52. {
  53. m_IterA.Next ();
  54. m_IterB.Next ();
  55. inherited::Next ();
  56. }
  57. }
  58. inline data_type Current () { return value_type (m_IterA.Current (), m_IterB.Current ()); }
  59. inline data_type operator () () { return Current (); }
  60. inline data_type operator * () { return Current (); }
  61. inline virtual bool IsEmpty () const override
  62. {
  63. if (inherited::IsEmpty ())
  64. return true;
  65. return (m_IterA.IsEmpty () || m_IterB.IsEmpty ());
  66. }
  67. inline void Skip (int delta)
  68. {
  69. for (;! IsEmpty () && delta > 0; delta --)
  70. Next ();
  71. }
  72. public:
  73. inline IterType stdBegin () { return m_IterA.stdBegin (); }
  74. inline IterType stdCurrent () { return m_IterA.stdCurrent (); }
  75. inline IterType stdEnd () { return m_IterA.stdEnd (); }
  76. private:
  77. IteratorA m_IterA;
  78. IteratorB m_IterB;
  79. };
  80. };
  81. namespace Iterator
  82. {
  83. template <typename IteratorA, typename IteratorB, typename IteratorC>
  84. class Zip_Iterator3 : public __CoreIterator
  85. {
  86. typedef __CoreIterator inherited;
  87. public:
  88. using IterType = typename IteratorA::IterType;
  89. using value_type_A = typename IteratorA::value_type;
  90. using value_type_B = typename IteratorB::value_type;
  91. using value_type_C = typename IteratorC::value_type;
  92. using data_type_A = typename IteratorA::data_type;
  93. using data_type_B = typename IteratorB::data_type;
  94. using data_type_C = typename IteratorC::data_type;
  95. using value_type = std::tuple <value_type_A, value_type_B, value_type_C>;
  96. using data_type = value_type;
  97. using deref_type = value_type;
  98. public:
  99. Zip_Iterator3 () = delete;
  100. Zip_Iterator3 (IteratorA & a, IteratorB & b, IteratorC & c) :
  101. m_IterA (a),
  102. m_IterB (b),
  103. m_IterC (c),
  104. inherited (a)
  105. {
  106. }
  107. Zip_Iterator3 (const Zip_Iterator3 & from) :
  108. m_IterA (from.m_IterA),
  109. m_IterB (from.m_IterB),
  110. m_IterC (from.m_IterC),
  111. inherited (from.m_IterA)
  112. {
  113. }
  114. Zip_Iterator3 (Zip_Iterator3 && from) :
  115. m_IterA (from.m_IterA),
  116. m_IterB (from.m_IterB),
  117. m_IterC (from.m_IterC),
  118. inherited (from.m_IterA)
  119. {
  120. }
  121. public:
  122. inline virtual void Next () override
  123. {
  124. if (! IsEmpty ())
  125. {
  126. m_IterA.Next ();
  127. m_IterB.Next ();
  128. m_IterC.Next ();
  129. inherited::Next ();
  130. }
  131. }
  132. inline data_type Current ()
  133. {
  134. return value_type (m_IterA.Current (), m_IterB.Current (), m_IterC.Current ());
  135. }
  136. inline data_type operator () () { return Current (); }
  137. inline data_type operator * () { return Current (); }
  138. inline virtual bool IsEmpty () const override
  139. {
  140. if (inherited::IsEmpty ())
  141. return true;
  142. return (m_IterA.IsEmpty () || m_IterB.IsEmpty () || m_IterC.IsEmpty ());
  143. }
  144. inline void Skip (int delta)
  145. {
  146. for (;! IsEmpty () && delta > 0; delta --)
  147. Next ();
  148. }
  149. public:
  150. inline IterType stdBegin () { return m_IterA.astdBegin (); }
  151. inline IterType stdCurrent () { return m_IterA.bstdCurrent (); }
  152. inline IterType stdEnd () { return m_IterA.cstdEnd (); }
  153. private:
  154. IteratorA m_IterA;
  155. IteratorB m_IterB;
  156. IteratorC m_IterC;
  157. };
  158. };