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

📄 ew_list.h

📁 基于Windml2.0的窗口系统原代码 , 以及和MFC CDC兼容的CDC
💻 H
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------------------------------

	EW_list.h - 单、双向链表容器及迭代器头文件

	本程序是FishGUI软件的一部分

	版权所有 (C) 2003,2004 王咏武
	http://www.contextfree.net/wangyw/

----------------------------------------------------------------------------

	作者对 FishGUI 软件及其所有源代码授权如下:

	允许任何个人、组织、机构、企业无偿获得、修改、使用、重新发布 FishGUI 软
	件及其源代码,或按照有偿或者无偿的方式发行基于 FishGUI 源代码的全部或部
	分内容开发的软件产品,——但行使以上权利时,须遵守以下约定:

	1、重新发布 FishGUI 软件及其源代码时,不得隐去软件及其源代码中原有的版
	   权信息和开发者标识。

	2、发行基于 FishGUI 源代码的全部或部分内容开发的软件产品时,必须在产品
	   的显著位置标明以下字样:

	   【本产品的一部分功能是基于王咏武在 FishGUI 软件中的工作完成的】

	3、在正式出版物中引用 FishGUI 的文档、源代码或注释内容的,应注明软件的
	   原作者为王咏武。

--------------------------------------------------------------------------*/
/*! \addtogroup Utility
 *  @{ 
 */

/*! \file
 *  \brief 单、双向链表容器及迭代器头文件
 *
*/

#ifndef _EW_LIST_H_
#define _EW_LIST_H_

//##ModelId=3FD88507008D
/*! \brief 单向链表的节点结构
 *
 *  \param ITEM 节点中保存的对象类型,该节点中只保存ITEM对象的指针,并且不负责该对象的释放
 */
template <class ITEM>
struct EW_SList_Node
{
    //##ModelId=3FD8850802FC
    /*! \brief 缺省构造函数
     *
     *  \ref EW_SList_Node::m_pItem和\ref EW_SList_Node::m_pNext都被设置为\ref NULL
     */
    EW_SList_Node() : m_pItem(NULL), m_pNext(NULL) {}
    
    //##ModelId=40925B4D03DE
    /*! \brief 转换构造函数
     *
     *  \ref EW_SList_Node::m_pNext被设置为\ref NULL
     *  \param pItem 需转换的对象指针
     */
    EW_SList_Node(ITEM * const pItem) : m_pItem(pItem), m_pNext(NULL) {}
    
    //##ModelId=3FD8850802CA
    ITEM          * m_pItem;            /*!< 指向该结点保存的对象,\ref EW_SList_Node类不负责该对象的释放 */
    //##ModelId=3FD8850802E1
    EW_SList_Node * m_pNext;            /*!< 指向直接后继结点的指针 */
};

//##ModelId=3FD885060262
/*! \brief 双向链表的节点结构
 *
 *  \param ITEM 节点中保存的对象类型,该节点中只保存ITEM对象的指针,并且不负责该对象的释放
 */
template <class ITEM>
struct EW_BList_Node
{
    //##ModelId=3FD8850701E2
    /*! \brief 缺省构造函数
     *
     *  \ref EW_BList_Node::m_pItem、\ref EW_BList_Node::m_pPrev和\ref EW_BList_Node::m_pNext都被设置为\ref NULL
     */
    EW_BList_Node() : m_pItem(NULL), m_pPrev(NULL), m_pNext(NULL) {}

    //##ModelId=40925B4C02E2
    /*! \brief 转换构造函数
     *
     *  \ref EW_BList_Node::m_pPrev和\ref EW_BList_Node::m_pNext被设置为\ref NULL
     *  \param pItem 需转换的对象指针
     */
    EW_BList_Node(ITEM * const pItem) : m_pItem(pItem), m_pPrev(NULL), m_pNext(NULL) {}
    
    //##ModelId=3FD88507018A
    ITEM          * m_pItem;            /*!< 指向该结点保存的对象,\ref EW_SList_Node类不负责该对象的释放 */
    //##ModelId=3FD8850701A7
    EW_BList_Node * m_pPrev;            /*!< 指向直接前趋结点的指针 */
    //##ModelId=3FD8850701C7
    EW_BList_Node * m_pNext;            /*!< 指向直接后继结点的指针 */
};

//##ModelId=3FD8850602EF
/*! \brief 正向迭代器类
 *
 *  \param NODE 节点类型
 *  \param ITEM 节点中保存的对象类型
 */
template <class NODE, class ITEM>
class EW_ForwardIterator
{
public:
    //##ModelId=3FD8850702DC
    /*! \brief 正向迭代器类的缺省构造函数 */
    EW_ForwardIterator() : m_pNode(NULL) {}
    
    //##ModelId=3FD8850702E6
    /*! \brief 正向迭代器类的转换构造函数
     *
     *  把节点类指针转换成正向迭代器
     */
    EW_ForwardIterator(NODE * const pNode) : m_pNode(pNode) {}

    //##ModelId=3FD8850702F0
    /*! \brief 重载*运算符函数
     *
     *  把正向迭代器转换成其指向的对象的引用
     *  \return 正向迭代器转换成其指向的对象的引用
     */
    ITEM & operator*() const { return * (m_pNode->m_pItem); }

    //##ModelId=3FD8850702FA
    /*! \brief 重载->运算符函数
     *
     *  把正向迭代器转换成其指向的对象的指针
     *  \return 正向迭代器转换成其指向的对象的指针
     */
    ITEM * operator->() const { return m_pNode->m_pItem; }

    //##ModelId=3FD885070304
    /*! \brief 重载转换运算符函数
     *
     *  把正向迭代器转换成其指向的对象的指针
     *  \return 正向迭代器转换成其指向的对象的指针
     */
    operator ITEM *() const { return m_pNode->m_pItem; }

    //##ModelId=3FD885070305
    /*! \brief 是否遍历结束
     *
     *  \return true    已经遍历结束
     *          false   还未遍历结束
     */
    bool IsDone() const { return ! m_pNode; }

    //##ModelId=3FD88507030E
    /*! \brief 重载前置++运算符函数
     *
     *  正向迭代器指向下一个对象
     *  \return 改变后的正向迭代器
     */
    EW_ForwardIterator & operator++()
    {
        if (m_pNode)
            m_pNode = m_pNode->m_pNext;
        return * this;
    }

    //##ModelId=3FD885070318
    /*! \brief 重载后置++运算符函数
     *
     *  正向迭代器指向下一个对象
     *  \return 改变前的正向迭代器
     */
    const EW_ForwardIterator operator++(int)
    {
        EW_ForwardIterator tmp = * this;
        if (m_pNode) m_pNode = m_pNode->m_pNext;
        return tmp;
    }

    //##ModelId=3FD885070323
    /*! \brief 重载==运算符函数
     *
     *  比较两个正向迭代器是否指向同一个对象
     *  \return true    指向同一个对象
     *          false   指向不同的对象
     */
    bool operator==(const EW_ForwardIterator & i) const { return m_pNode == i.m_pNode; }

    //##ModelId=3FD885070336
    /*! \brief 重载!=运算符函数
     *
     *  比较两个正向迭代器是否指向不同的对象
     *  \return true    指向不同的对象
     *          false   指向同一个对象
     */
    bool operator!=(const EW_ForwardIterator & i) const { return m_pNode != i.m_pNode; }

    //##ModelId=3FD88507034A
    /*! \brief 重载==运算符函数
     *
     *  比较正向迭代器是否指向某个特定的对象
     *  \return true    指向该对象
     *          false   不是指向该对象
     */
    bool operator==(ITEM * const p) const { return m_pNode->m_pItem == p; }

    //##ModelId=3FD88507035E
    /*! \brief 重载!=运算符函数
     *
     *  比较正向迭代器是否不指向某个特定的对象
     *  \return true    不是指向该对象
     *          false   指向该对象
     */
    bool operator!=(ITEM * const p) const { return m_pNode->m_pItem != p; }

protected:
    //##ModelId=3FD8850702C9
    NODE * m_pNode;                 /*!< \brief 正向迭代器当前指向的节点 */
};

//##ModelId=3FD88506029F
/*! \brief 反向迭代器类
 *
 *  \param ITEM 节点中保存的对象类型
 */
template <class ITEM>
class EW_BackIterator
{
public:
    //##ModelId=3FD8850602D2
    /*! \brief 反向迭代器能使用的双向链表节点类型 */
    typedef EW_BList_Node<ITEM> node;

    //##ModelId=3FD885070228
    /*! \brief 反向迭代器类的缺省构造函数 */
    EW_BackIterator() : m_pNode(NULL) {}

    //##ModelId=3FD885070232
    /*! \brief 反向迭代器类的转换构造函数
     *
     *  把节点类指针转换成反向迭代器
     */
    EW_BackIterator(node * const pNode) : m_pNode(pNode) {}

    //##ModelId=3FD88507023C
    /*! \brief 重载*运算符函数
     *
     *  把反向迭代器转换成其指向的对象的引用
     *  \return 反向迭代器转换成其指向的对象的引用
     */
    ITEM & operator*() const { return * (m_pNode->m_pItem); }

    //##ModelId=3FD885070246
    /*! \brief 重载->运算符函数
     *
     *  把反向迭代器转换成其指向的对象的指针
     *  \return 反向迭代器转换成其指向的对象的指针
     */
    ITEM * operator->() const { return m_pNode->m_pItem; }

    //##ModelId=3FD885070250
    /*! \brief 重载转换运算符函数
     *
     *  把反向迭代器转换成其指向的对象的指针
     *  \return 反向迭代器转换成其指向的对象的指针
     */
    operator ITEM *() const { return m_pNode->m_pItem; }

    //##ModelId=3FD885070251
    /*! \brief 是否遍历结束
     *
     *  \return true    已经遍历结束
     *          false   还未遍历结束
     */
    bool IsDone() const { return ! m_pNode; }

    //##ModelId=3FD88507025A
    /*! \brief 重载前置++运算符函数
     *
     *  反向迭代器指向前一个对象
     *  \return 改变后的反向迭代器
     */
    EW_BackIterator & operator++()
    {
        if (m_pNode)
            m_pNode = m_pNode->m_pPrev;
        return * this;
    }

    //##ModelId=3FD885070264
    /*! \brief 重载后置++运算符函数
     *
     *  反向迭代器指向前一个对象
     *  \return 改变前的反向迭代器
     */
    const EW_BackIterator operator++(int)
    {
        EW_BackIterator tmp = * this;
        if (m_pNode) m_pNode = m_pNode->m_pPrev;
        return tmp;
    }

    //##ModelId=3FD88507026F
    /*! \brief 重载==运算符函数
     *
     *  比较两个反向迭代器是否指向同一个对象
     *  \return true    指向同一个对象
     *          false   指向不同的对象
     */
    bool operator==(const EW_BackIterator & i) const { return m_pNode == i.m_pNode; }

    //##ModelId=3FD885070282
    /*! \brief 重载!=运算符函数
     *
     *  比较两个反向迭代器是否指向不同的对象
     *  \return true    指向不同的对象
     *          false   指向同一个对象
     */
    bool operator!=(const EW_BackIterator & i) const { return m_pNode != i.m_pNode; }

    //##ModelId=3FD885070296
    /*! \brief 重载==运算符函数
     *
     *  比较反向迭代器是否指向某个特定的对象
     *  \return true    指向该对象
     *          false   不是指向该对象
     */
    bool operator==(ITEM * const p) const { return m_pNode->m_pItem == p; }

    //##ModelId=3FD8850702A1
    /*! \brief 重载!=运算符函数
     *
     *  比较反向迭代器是否不指向某个特定的对象
     *  \return true    不是指向该对象
     *          false   指向该对象
     */
    bool operator!=(ITEM * const p) const { return m_pNode->m_pItem != p; }

private:
    //##ModelId=3FD885070215
    node * m_pNode;                 /*!< \brief 反向迭代器当前指向的节点 */
};

//##ModelId=3FD885060385
/*! \brief 循环迭代器类
 *
 *  循环迭代器从起始对象指针开始遍历,直到容器中的最后一个对象,
 *  然后再从容器中的第一个元素开始遍历,直到起始对象(不包括起始对象)
 *  \param ITEM 节点中保存的对象类型
 */
template <class ITEM>
class EW_LoopIterator
{
public:
    //##ModelId=3FD88508011B
    /*! \brief 循环迭代器的构造函数
     *
     *  \param pFirst 指向容器中的第一个对象的指针
     *  \param pStart 指向循环遍历的起始对象的指针
     */
    EW_LoopIterator(EW_BList_Node<ITEM> * const pFirst, ITEM * const pStart)
        : m_pFirst(pFirst), m_pStart(pStart), m_IsDone(false)
    {
        m_pNode = m_pFirst;
        while (m_pNode && m_pNode->m_pItem != m_pStart) m_pNode = m_pNode->m_pNext;
        if (! m_pNode)
            m_IsDone = true;
        else
        {
            m_pNode = m_pNode->m_pNext;
            if (! m_pNode)
                m_pNode = m_pFirst;
        }
    }

    //##ModelId=3FD88508012F
    /*! \brief 重载*运算符函数
     *
     *  把循环迭代器转换成其指向的对象的引用
     *  \return 循环迭代器转换成其指向的对象的引用
     */
    ITEM & operator*() const { return * (m_pNode->m_pItem); }
    
    //##ModelId=3FD885080139
    /*! \brief 重载->运算符函数
     *
     *  把循环迭代器转换成其指向的对象的指针
     *  \return 循环向迭代器转换成其指向的对象的指针
     */
    ITEM * operator->() const { return m_pNode->m_pItem; }

    //##ModelId=3FD885080143
    /*! \brief 重载转换运算符函数
     *
     *  把循环迭代器转换成其指向的对象的指针
     *  \return 循环迭代器转换成其指向的对象的指针
     */
    operator ITEM *() const { return m_pNode->m_pItem; }

    //##ModelId=3FD88508014D
    /*! \brief 是否遍历结束,即循环遍历完容器中的所有对象
     *
     *  \return true    已经遍历结束
     *          false   还未遍历结束
     */
    bool IsDone() const { return m_IsDone; }

    //##ModelId=3FD88508014E
    /*! \brief 重载前置++运算符函数
     *
     *  循环迭代器指向下一个对象
     *  \return 改变后的循环迭代器
     */
    EW_LoopIterator & operator++()
    {
        if (! m_IsDone)
        {
            m_pNode = m_pNode->m_pNext;
            if (! m_pNode)
                m_pNode = m_pFirst;
            if ((m_pNode->m_pNext && m_pNode->m_pNext->m_pItem == m_pStart) ||
                (! m_pNode->m_pNext && m_pFirst->m_pItem == m_pStart))
                m_IsDone = true;
        }
        return * this;
    }

    //##ModelId=3FD885080157
    /*! \brief 重载后置++运算符函数
     *
     *  循环迭代器指向下一个对象
     *  \return 改变前的循环迭代器
     */
    const EW_LoopIterator operator++(int)
    {
        EW_LoopIterator tmp = * this;
        if (! m_IsDone)
        {
            m_pNode = m_pNode->m_pNext;

⌨️ 快捷键说明

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