123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #pragma once
- #include <optional>
- #include "Iterator.Base.tlh"
- //-----------------------------------------------------------------------------
- // Function_Iterator
- //-----------------------------------------------------------------------------
- namespace Iterator
- {
- template <typename T>
- class Function_Iterator : public __CoreIterator
- {
- typedef __CoreIterator inherited;
- public:
- using FuncType = std::function <std::optional <T> ()>;
- public:
- using value_type = typename T;
- using data_type = typename T&;
- using deref_type = value_type;
- public:
- // Function_Iterator () = delete;
- Function_Iterator () = default;
- Function_Iterator (FuncType & fun) : m_GetAndNext (fun)
- {
- m_Count = INT_MAX;
- m_Index = 0;
- m_Current = m_GetAndNext ();
- }
- public:
- inline virtual void Next () override
- {
- if (! IsEmpty ())
- {
- m_Current = m_GetAndNext ();
- inherited::Next ();
- }
- }
- inline data_type Current () { return m_Current.value (); }
- inline data_type operator () () { return Current (); }
- inline data_type operator * () { return Current (); }
- inline virtual bool IsEmpty () const override
- {
- if (inherited::IsEmpty ())
- return true;
- return ! m_Current.has_value ();
- }
- inline void Skip (int delta)
- {
- for (; ! IsEmpty () && delta > 0; delta --)
- Next ();
- }
- protected:
- void InitFrom (FuncType & fun)
- {
- m_GetAndNext = fun;
- m_Count = INT_MAX;
- m_Index = 0;
- m_Current = m_GetAndNext ();
- }
- private:
- FuncType m_GetAndNext;
- std::optional <T> m_Current;
- };
- };
|