Iterator.Concat.tlh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #pragma once
  2. #include <tuple>
  3. #include "Iterator.Base.tlh"
  4. //-----------------------------------------------------------------------------
  5. // Concat_Iterator
  6. // 注意:
  7. // Count () 已经被定义为 Extension::Count ()
  8. // 所以这里强行转换为 __CoreIterator
  9. //
  10. // 注意:
  11. // 不要求 IteratorA 和 IteratorB 是同一个类型,
  12. // 但是要求两者的 value_type 和 data_type 一样
  13. //-----------------------------------------------------------------------------
  14. namespace Iterator
  15. {
  16. template <typename IteratorA, typename IteratorB>
  17. class Concat_Iterator2 : public __CoreIterator
  18. {
  19. typedef __CoreIterator inherited;
  20. public:
  21. using IterType = typename IteratorA::IterType;
  22. using value_type = typename IteratorA::value_type;
  23. using data_type = typename IteratorA::data_type;
  24. using deref_type = value_type;
  25. public:
  26. Concat_Iterator2 () = delete;
  27. Concat_Iterator2 (IteratorA & a, IteratorB & b) :
  28. m_IterA (a),
  29. m_IterB (b),
  30. inherited (a)
  31. {
  32. __CoreIterator & CA (m_IterA);
  33. __CoreIterator & CB (m_IterB);
  34. m_Count = CA.Count () + CB.Count ();
  35. }
  36. Concat_Iterator2 (const Concat_Iterator2 & from) :
  37. m_IterA (from.m_IterA),
  38. m_IterB (from.m_IterB),
  39. inherited (from.m_IterA)
  40. {
  41. __CoreIterator & CA (m_IterA);
  42. __CoreIterator & CB (m_IterB);
  43. m_Count = CA.Count () + CB.Count ();
  44. }
  45. Concat_Iterator2 (Concat_Iterator2 && from) :
  46. m_IterA (from.m_IterA),
  47. m_IterB (from.m_IterB),
  48. inherited (from.m_IterA)
  49. {
  50. __CoreIterator & CA (m_IterA);
  51. __CoreIterator & CB (m_IterB);
  52. m_Count = CA.Count () + CB.Count ();
  53. }
  54. public:
  55. inline virtual void Next () override
  56. {
  57. if (inherited::IsEmpty ())
  58. return;
  59. if (! m_IterA.IsEmpty ())
  60. m_IterA.Next ();
  61. else
  62. if (! m_IterB.IsEmpty ())
  63. m_IterB.Next ();
  64. inherited::Next ();
  65. }
  66. inline data_type Current ()
  67. {
  68. if (! m_IterA.IsEmpty ())
  69. return (m_IterA.Current ());
  70. else
  71. return (m_IterB.Current ());
  72. }
  73. inline data_type operator () () { return Current (); }
  74. inline data_type operator * () { return Current (); }
  75. inline virtual bool IsEmpty () const override
  76. {
  77. if (inherited::IsEmpty ())
  78. return true;
  79. return (m_IterA.IsEmpty () && m_IterB.IsEmpty ());
  80. }
  81. inline void Skip (int delta)
  82. {
  83. for (;! IsEmpty () && delta > 0; delta --)
  84. Next ();
  85. }
  86. public:
  87. inline IterType stdBegin () { return m_IterA.stdBegin (); }
  88. inline IterType stdCurrent () { return m_IterA.stdCurrent (); }
  89. inline IterType stdEnd () { return m_IterA.stdEnd (); }
  90. private:
  91. IteratorA m_IterA;
  92. IteratorB m_IterB;
  93. };
  94. };