home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / MFCITER.ZIP / Source / MyProjects / MFCIteratorDemo / BaseMFCIter.h next >
Encoding:
C/C++ Source or Header  |  1999-02-22  |  2.8 KB  |  91 lines

  1. #ifndef BASEMFCITERATOR_H
  2. #define BASEMFCITERATOR_H
  3.  
  4. //***************************************************************************/
  5. //
  6. // BaseMFCIter class implementation.
  7. //
  8. // Base iterator class for iterating MFC-style containers that use GetFirstPos,
  9. // GetNextItem semantics (where GetFirstPos returns a value to be passed to
  10. // GetNextItem, which updates it.
  11. //
  12. // NOTE: The Item type must have a default constructor if it is not a basic type.
  13. //***************************************************************************
  14.  
  15. #if _MSC_VER > 1000
  16. #pragma once
  17. #endif // _MSC_VER > 1000
  18.  
  19. #include <iterator>
  20.  
  21. template<class Item, class Cont, class Key = POSITION>
  22. class BaseMFCIter : public std::iterator<std::input_iterator_tag, Item>
  23. {
  24. public:
  25.     typedef Key     (Cont::*GetFirstFunctionPtr)    ()      const;
  26.     typedef Item    (Cont::*GetNextFunctionPtr)     (Key&)  const;
  27.     
  28.     BaseMFCIter() : m_pCont(0), m_Pos(0), m_GetFirstFunc(0), m_GetNextFunc(0), m_End(true) {}
  29.  
  30.     BaseMFCIter(Cont* pCont, GetFirstFunctionPtr pFF, GetNextFunctionPtr pNF) 
  31.         : m_pCont(pCont), m_Pos(0), m_GetFirstFunc(pFF), m_GetNextFunc(pNF)
  32.     { init(); }
  33.  
  34.     BaseMFCIter(const BaseMFCIter& vi) : m_pCont(vi.m_pCont), m_Pos(0),
  35.                m_GetFirstFunc(vi.m_GetFirstFunc), m_GetNextFunc(vi.m_GetNextFunc)
  36.     { init(); }
  37.  
  38.     BaseMFCIter& operator=(const BaseMFCIter& vi)
  39.     {
  40.         m_pCont         = vi.m_pCont; 
  41.         m_GetFirstFunc  = vi.m_GetFirstFunc;
  42.         m_GetNextFunc   = vi.m_GetNextFunc;
  43.         init();  
  44.         return *this; 
  45.     }
  46.  
  47.     bool operator == (const BaseMFCIter& rhs) const
  48.     { return (m_Pos == rhs.m_Pos && m_End == rhs.m_End); }
  49.  
  50.     bool operator != (const BaseMFCIter& rhs) const 
  51.     { return !operator==(rhs); }
  52.  
  53.     BaseMFCIter&    operator ++ ()      { advance(); return *this; }
  54.     BaseMFCIter&    operator ++ (int)   { BaseMFCIter ret(*this); advance(); return ret; }
  55.     Item&           operator *  ()      { return m_Item; }
  56.     Item&           operator -> ()      { return m_Item; }
  57.     static BaseMFCIter end      ()      { return BaseMFCIter(); }
  58.  
  59. protected:
  60.  
  61. private:
  62.     Item    m_Item;
  63.     Cont*   m_pCont;
  64.     Key     m_Pos;
  65.     bool    m_End;
  66.  
  67.     GetFirstFunctionPtr m_GetFirstFunc;
  68.     GetNextFunctionPtr  m_GetNextFunc;
  69.  
  70.     virtual void init() 
  71.     {
  72.         m_Pos = 0;
  73.         m_End = true;
  74.  
  75.         if (m_pCont && m_GetFirstFunc != 0)
  76.         {
  77.             m_Pos = (m_pCont->*m_GetFirstFunc)();
  78.             advance();
  79.         }
  80.     }
  81.  
  82.     virtual void advance()
  83.     {
  84.         m_End = m_Pos ? false : true;
  85.         m_Item = (m_Pos && m_pCont && m_GetNextFunc != 0) ? 
  86.                         (m_pCont->*m_GetNextFunc)(m_Pos) :
  87.                         Item();
  88.     }
  89. };
  90.  
  91. #endif