Iterator.Function.tlh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include <optional>
  3. #include "Iterator.Base.tlh"
  4. //-----------------------------------------------------------------------------
  5. // Function_Iterator
  6. //-----------------------------------------------------------------------------
  7. namespace Iterator
  8. {
  9. template <typename T>
  10. class Function_Iterator : public __CoreIterator
  11. {
  12. typedef __CoreIterator inherited;
  13. public:
  14. using FuncType = std::function <std::optional <T> ()>;
  15. public:
  16. using value_type = typename T;
  17. using data_type = typename T&;
  18. using deref_type = value_type;
  19. public:
  20. // Function_Iterator () = delete;
  21. Function_Iterator () = default;
  22. Function_Iterator (FuncType & fun) : m_GetAndNext (fun)
  23. {
  24. m_Count = INT_MAX;
  25. m_Index = 0;
  26. m_Current = m_GetAndNext ();
  27. }
  28. public:
  29. inline virtual void Next () override
  30. {
  31. if (! IsEmpty ())
  32. {
  33. m_Current = m_GetAndNext ();
  34. inherited::Next ();
  35. }
  36. }
  37. inline data_type Current () { return m_Current.value (); }
  38. inline data_type operator () () { return Current (); }
  39. inline data_type operator * () { return Current (); }
  40. inline virtual bool IsEmpty () const override
  41. {
  42. if (inherited::IsEmpty ())
  43. return true;
  44. return ! m_Current.has_value ();
  45. }
  46. inline void Skip (int delta)
  47. {
  48. for (; ! IsEmpty () && delta > 0; delta --)
  49. Next ();
  50. }
  51. protected:
  52. void InitFrom (FuncType & fun)
  53. {
  54. m_GetAndNext = fun;
  55. m_Count = INT_MAX;
  56. m_Index = 0;
  57. m_Current = m_GetAndNext ();
  58. }
  59. private:
  60. FuncType m_GetAndNext;
  61. std::optional <T> m_Current;
  62. };
  63. };