#pragma once #include #include "Iterator.Base.tlh" //----------------------------------------------------------------------------- // Function_Iterator //----------------------------------------------------------------------------- namespace Iterator { template class Function_Iterator : public __CoreIterator { typedef __CoreIterator inherited; public: using FuncType = std::function ()>; 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 m_Current; }; };