home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / MFCITER.ZIP / NestedMFCIterator.h < prev   
Encoding:
C/C++ Source or Header  |  1999-02-22  |  2.8 KB  |  81 lines

  1. #ifndef NESTEDMFCITERATOR_H
  2. #define NESTEDMFCITERATOR_H
  3. //****************************************************************************
  4. //
  5. // NestedIter class implementation.
  6. //
  7. // Iterator class for iterating through the contents of nested containers
  8. // using iterators for each container type.
  9. //
  10. // class OuterCont is the container that holds the collections iterated over by
  11. // class OuterIter. OuterIter dereferences to a container of items iterated over
  12. // by class InnerIter. NestedMFCIter itself dereferences to the item iterated by
  13. // InnerIter, thus allowing iteration over every item in every container in OuterCont.
  14. //
  15. // e.g. To iterate over all the Views for all the Documents in a CDocTemplate:
  16. //
  17. //    typedef NestedMFCIter<ViewIter, DocIter, CDocTemplate> DocTemplateViewIter;
  18. //
  19. // Here, ViewIter iterates the CViews in a CDocument, and DocIter iterates the
  20. // CDocuments in a CDocTemplate.
  21. //
  22. // NestedMFCIter types can themselves be nested, allowing additional containment levels:
  23. // e.g. to iterate over all the views in an application:
  24. //
  25. //    typedef NestedMFCIter<DocTemplateViewIter, CDocTemplateIter, CWinApp> AppViewIter;
  26. //
  27. // Here, DocTemplateViewIter iterates over all the CViews in a CDocTemplate, 
  28. // CDocTemplateIter iterates over all the CDocTemplates in a CWinApp.
  29. //
  30. //***************************************************************************
  31.  
  32. #include <iterator>
  33.  
  34. #if _MSC_VER > 1000
  35. #pragma once
  36. #endif // _MSC_VER > 1000
  37.  
  38. template<class InnerIter, class OuterIter, class OuterCont> 
  39. class NestedMFCIter : public std::iterator<std::input_iterator_tag, InnerIter::value_type>
  40. {
  41. public:
  42.     NestedMFCIter(OuterCont* pOC = 0) : 
  43.         m_OuterIt(pOC), m_InnerIt(pOC ? *m_OuterIt : 0) 
  44.     {}
  45.  
  46.     NestedMFCIter& operator=(OuterCont* pOC)
  47.     { m_OuterIt = pOC; m_InnerIt = *m_OuterIt; return *this; }
  48.         
  49.     bool operator == (const NestedMFCIter& rhs) const
  50.     { return m_InnerIt == rhs.m_InnerIt; }
  51.  
  52.     bool operator != (const NestedMFCIter& rhs) const 
  53.     { return !operator==(rhs); }
  54.  
  55.     NestedMFCIter& operator ++ () { advance(); return *this; }
  56.  
  57.     NestedMFCIter& operator ++ (int) 
  58.     { NestedMFCIter ret(*this); advance(); return ret; }
  59.  
  60.     InnerIter::value_type operator*()            { return *m_InnerIt; }
  61.     InnerIter::value_type operator->()           { return *m_InnerIt; }
  62.     static NestedMFCIter end() { return NestedMFCIter(); }
  63.  
  64. private:
  65.     OuterIter   m_OuterIt;
  66.     InnerIter   m_InnerIt;
  67.  
  68.     // Advance to next inner item. If null, advance outer iterator to next
  69.     virtual void advance()
  70.     {
  71.         if (m_InnerIt != InnerIter::end())
  72.             ++m_InnerIt;
  73.  
  74.         while (m_InnerIt == InnerIter::end() && (++m_OuterIt) != OuterIter::end())
  75.         {
  76.             m_InnerIt = *m_OuterIt;
  77.         }
  78.     } 
  79. };
  80.  
  81. #endif