⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basemfciter.h

📁 是人人对战的五子棋
💻 H
字号:
#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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -