home *** CD-ROM | disk | FTP | other *** search
- #ifndef BASEMFCITERATOR_H
- #define BASEMFCITERATOR_H
-
- //***************************************************************************/
- //
- // BaseMFCIter class implementation.
- //
- // Base iterator class for iterating MFC-style containers that use GetFirstPos,
- // GetNextItem semantics (where GetFirstPos returns a value to be passed to
- // GetNextItem, which updates it.
- //
- // NOTE: The Item type must have a default constructor if it is not a basic type.
- //***************************************************************************
-
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
-
- #include <iterator>
-
- template<class Item, class Cont, class Key = POSITION>
- class BaseMFCIter : public std::iterator<std::input_iterator_tag, Item>
- {
- public:
- typedef Key (Cont::*GetFirstFunctionPtr) () const;
- typedef Item (Cont::*GetNextFunctionPtr) (Key&) const;
-
- BaseMFCIter() : m_pCont(0), m_Pos(0), m_GetFirstFunc(0), m_GetNextFunc(0), m_End(true) {}
-
- BaseMFCIter(Cont* pCont, GetFirstFunctionPtr pFF, GetNextFunctionPtr pNF)
- : m_pCont(pCont), m_Pos(0), m_GetFirstFunc(pFF), m_GetNextFunc(pNF)
- { init(); }
-
- BaseMFCIter(const BaseMFCIter& vi) : m_pCont(vi.m_pCont), m_Pos(0),
- m_GetFirstFunc(vi.m_GetFirstFunc), m_GetNextFunc(vi.m_GetNextFunc)
- { init(); }
-
- BaseMFCIter& operator=(const BaseMFCIter& vi)
- {
- m_pCont = vi.m_pCont;
- m_GetFirstFunc = vi.m_GetFirstFunc;
- m_GetNextFunc = vi.m_GetNextFunc;
- init();
- return *this;
- }
-
- bool operator == (const BaseMFCIter& rhs) const
- { return (m_Pos == rhs.m_Pos && m_End == rhs.m_End); }
-
- bool operator != (const BaseMFCIter& rhs) const
- { return !operator==(rhs); }
-
- BaseMFCIter& operator ++ () { advance(); return *this; }
- BaseMFCIter& operator ++ (int) { BaseMFCIter ret(*this); advance(); return ret; }
- Item& operator * () { return m_Item; }
- Item& operator -> () { return m_Item; }
- static BaseMFCIter end () { return BaseMFCIter(); }
-
- protected:
-
- private:
- Item m_Item;
- Cont* m_pCont;
- Key m_Pos;
- bool m_End;
-
- GetFirstFunctionPtr m_GetFirstFunc;
- GetNextFunctionPtr m_GetNextFunc;
-
- virtual void init()
- {
- m_Pos = 0;
- m_End = true;
-
- if (m_pCont && m_GetFirstFunc != 0)
- {
- m_Pos = (m_pCont->*m_GetFirstFunc)();
- advance();
- }
- }
-
- virtual void advance()
- {
- m_End = m_Pos ? false : true;
- m_Item = (m_Pos && m_pCont && m_GetNextFunc != 0) ?
- (m_pCont->*m_GetNextFunc)(m_Pos) :
- Item();
- }
- };
-
- #endif