home *** CD-ROM | disk | FTP | other *** search
- #ifndef NESTEDMFCITERATOR_H
- #define NESTEDMFCITERATOR_H
- //****************************************************************************
- //
- // NestedIter class implementation.
- //
- // Iterator class for iterating through the contents of nested containers
- // using iterators for each container type.
- //
- // class OuterCont is the container that holds the collections iterated over by
- // class OuterIter. OuterIter dereferences to a container of items iterated over
- // by class InnerIter. NestedMFCIter itself dereferences to the item iterated by
- // InnerIter, thus allowing iteration over every item in every container in OuterCont.
- //
- // e.g. To iterate over all the Views for all the Documents in a CDocTemplate:
- //
- // typedef NestedMFCIter<ViewIter, DocIter, CDocTemplate> DocTemplateViewIter;
- //
- // Here, ViewIter iterates the CViews in a CDocument, and DocIter iterates the
- // CDocuments in a CDocTemplate.
- //
- // NestedMFCIter types can themselves be nested, allowing additional containment levels:
- // e.g. to iterate over all the views in an application:
- //
- // typedef NestedMFCIter<DocTemplateViewIter, CDocTemplateIter, CWinApp> AppViewIter;
- //
- // Here, DocTemplateViewIter iterates over all the CViews in a CDocTemplate,
- // CDocTemplateIter iterates over all the CDocTemplates in a CWinApp.
- //
- //***************************************************************************
-
- #include <iterator>
-
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
-
- template<class InnerIter, class OuterIter, class OuterCont>
- class NestedMFCIter : public std::iterator<std::input_iterator_tag, InnerIter::value_type>
- {
- public:
- NestedMFCIter(OuterCont* pOC = 0) :
- m_OuterIt(pOC), m_InnerIt(pOC ? *m_OuterIt : 0)
- {}
-
- NestedMFCIter& operator=(OuterCont* pOC)
- { m_OuterIt = pOC; m_InnerIt = *m_OuterIt; return *this; }
-
- bool operator == (const NestedMFCIter& rhs) const
- { return m_InnerIt == rhs.m_InnerIt; }
-
- bool operator != (const NestedMFCIter& rhs) const
- { return !operator==(rhs); }
-
- NestedMFCIter& operator ++ () { advance(); return *this; }
-
- NestedMFCIter& operator ++ (int)
- { NestedMFCIter ret(*this); advance(); return ret; }
-
- InnerIter::value_type operator*() { return *m_InnerIt; }
- InnerIter::value_type operator->() { return *m_InnerIt; }
- static NestedMFCIter end() { return NestedMFCIter(); }
-
- private:
- OuterIter m_OuterIt;
- InnerIter m_InnerIt;
-
- // Advance to next inner item. If null, advance outer iterator to next
- virtual void advance()
- {
- if (m_InnerIt != InnerIter::end())
- ++m_InnerIt;
-
- while (m_InnerIt == InnerIter::end() && (++m_OuterIt) != OuterIter::end())
- {
- m_InnerIt = *m_OuterIt;
- }
- }
- };
-
- #endif