自己的底层代码库(十一)——容器类基类
来源:互联网 发布:数据恢复.apk 编辑:程序博客网 时间:2024/05/14 00:50
今天放上容器类的基类TContainer
1、以下4个接口需要子类实现
初始化\清空容器 virtual void Init(ContainerFlag dwLock) = 0;
获取该容器中第一个T对象 virtual T *GetHead() = 0;
获取该容器中curr的下一个T对象 virtual T *GetNext(T *curr) = 0;
获取链表中curr对应的管理结点对象 virtual void *GetNode(T *curr) = 0;
2、容器记录有一个m_IterList,保存所有在该容器上注册的迭代器
3、容器向所有子类提供一个接口:void ResetNext(T *next)
当容器remove一个对象时,需要调用该接口
检查所有注册的迭代器,判断remove的对象是否是下一个将要迭代的对象,是则将迭代器后移一个对象4、将锁对象放到了基类中,提供给子类使用,统一初始化参数的枚举定义ContainerFlag
5、向迭代器提供4个接口:
(1)、向该容器注册一个迭代器void Register(TIterator<T> &iter);
(2)、向该容器取消注册一个迭代器void UnRegister(TIterator<T> &iter);
(3)、迭代器开始遍历bool BeginListBy(TIterator<T> &iter);
(4)、迭代器获取下一个对象bool GetNextBy(TIterator<T> &iter);
这4个接口私有,只提供给迭代器使用,迭代器通过友元关系访问
接下来的工作就是修改之前提供的链表跟二叉树,让其继承自TContainer
下面上代码
TContainer.h
#ifndef _TContainer_h_#define _TContainer_h_#include <windows.h>#include "CList.h"#include "TIterator.h"#include "CLock.h"#include "tool.h"enum ContainerFlag{enum_EnableLock = 0,//容器是否开启临界区锁enum_DisableLock,};template <class T>class TContainer{friend class TIterator<T>;public:TContainer();virtual ~TContainer();//获取容器中对象的个数DWORD GetLen();//初始化\清空容器virtual void Init(ContainerFlag dwLock) = 0;//获取该容器中第一个T对象virtual T *GetHead() = 0;//获取该容器中curr的下一个T对象virtual T *GetNext(T *curr) = 0;//获取链表中curr对应的管理结点对象virtual void *GetNode(T *curr) = 0;protected://当next指向的对象所对应的管理结点被操作删除时//检查注册在该容器上的所有迭代器//若有迭代器下一个将要迭代的结点指针是next//将下一个将要迭代的指针指针后移//继承该基类的各个容器子类在移除某一对象之前//需要调用该函数检查各迭代器的next指针是否需要后移void ResetNext(T *next);//容器中对象的个数DWORD m_dwLen;//是否使用临界区进行加锁ContainerFlag m_dwLock;//临界区,保证容器操作的线程安全CLock m_csLock;private://以下四个函数仅提供给Iterator使用://向该容器注册一个迭代器对象//定义一个迭代器对象后//需要将该迭代器注册给被迭代的容器void Register(TIterator<T> &iter);//向该容器取消注册一个迭代器对象//迭代完成后//需要将该迭代器从被迭代的容器中取消注册//若该函数不手动调用//在Iterator的析构时会自动调用void UnRegister(TIterator<T> &iter);//为迭代器iter准备遍历环境//修改Next指针//指向容器中的第一个节点//成功返回true//若容器中无结点//将Next指针置空,返回true//若迭代器iter未注册给本容器,则返回falsebool BeginListBy(TIterator<T> &iter);//修改迭代器iter的Next指针//指向下一个待遍历的结点//成功返回true//若迭代已经结束,没有下一个结点了//将Next指针置空,返回true//若迭代器iter未注册给本容器,则返回falsebool GetNextBy(TIterator<T> &iter);//在该容器上注册的迭代器的列表CList m_IterList;};#include "TContainer.hpp"#endif
TContainer.hpp
#ifndef _TContainer_hpp_#define _TContainer_hpp_template <class T>TContainer<T>::TContainer(){m_dwLen = 0;m_dwLock = enum_DisableLock;m_IterList.Init();}template <class T>TContainer<T>::~TContainer(){Node *pNode = m_IterList.GetHead();while(NULL != pNode){TIterator<T> *pIter = TIterator<T>::GetIterator(pNode);pIter->m_pContainer = NULL;pNode = pNode->m_pNext;}m_dwLen = 0;m_dwLock = enum_DisableLock;m_IterList.Init();}template <class T>DWORD TContainer<T>::GetLen(){return m_dwLen;}template <class T>void TContainer<T>::ResetNext(T *next){if (enum_EnableLock == m_dwLock){m_csLock.Lock();}Node *pNode = m_IterList.GetHead();while (NULL != pNode){TIterator<T> *pIterater = TIterator<T>::GetIterator(pNode);if (this == pIterater->m_pContainer){if (next == pIterater->m_pNextPtr){pIterater->m_pNextPtr = GetNext(pIterater->m_pNextPtr);}}pNode = pNode->m_pNext;}if (enum_EnableLock == m_dwLock){m_csLock.UnLock();}}template <class T>void TContainer<T>::Register(TIterator<T> &iter){if (enum_EnableLock == m_dwLock){m_csLock.Lock();}m_IterList.PushTail(iter.m_LinkNode);iter.m_pContainer = this;if (enum_EnableLock == m_dwLock){m_csLock.UnLock();}}template <class T>void TContainer<T>::UnRegister(TIterator<T> &iter){if (enum_EnableLock == m_dwLock){m_csLock.Lock();}m_IterList.Remove(iter.m_LinkNode);iter.m_pContainer = NULL;if (enum_EnableLock == m_dwLock){m_csLock.UnLock();}}template <class T>bool TContainer<T>::BeginListBy(TIterator<T> &iter){bool bRes = true;if (enum_EnableLock == m_dwLock){m_csLock.Lock();}if (this == iter.m_pContainer){iter.m_pNextPtr = GetHead();bRes = true;}if (enum_EnableLock == m_dwLock){m_csLock.UnLock();}return bRes;}template <class T>bool TContainer<T>::GetNextBy(TIterator<T> &iter){bool bRes = true;if (enum_EnableLock == m_dwLock){m_csLock.Lock();}if (this == iter.m_pContainer){iter.m_pNextPtr = GetNext(iter.m_pNextPtr);bRes = true;}if (enum_EnableLock == m_dwLock){m_csLock.UnLock();}return bRes;}#endif
- 自己的底层代码库(十一)——容器类基类
- 自己的底层代码库(一)——单链表
- 自己的底层代码库(二)——双链表
- 自己的底层代码库(十)——迭代器
- 自己的底层代码库(十二)——单例类
- 自己的底层代码库(十三)——锁
- 自己的底层代码库(十八)——一些工具函数代码
- 自己的底层代码库(九)——插入式的双链表
- 自己的底层代码库(十四)——float的截断
- 自己的底层代码库(七)——对象索引(修改)
- 自己的底层代码库(三)——AVL树
- 自己的底层代码库(四)——计时模块,以及效率测试
- 自己的底层代码库(五)——内存池,附加效率测试
- 自己的底层代码库(六)——对象池
- 自己的底层代码库(八)——获取函数调用堆栈
- 自己的底层代码库(十五)——对象队列
- 自己的底层代码库(十六)——数组模板
- 自己的底层代码库(十七)——随机数池
- Hadoop中常用的InputFormat、OutputFormat(转)
- 获取iPhone通话记录(需越狱)
- 2013CSDN全国高校巡讲之四川托普信息技术职业学院
- 挺住,意味着一切
- JavaScript event对象clientX,offsetX,screenX异同
- 自己的底层代码库(十一)——容器类基类
- 代码质量管理
- eclipse错误:The type java.lang.Object cannot be resolved.
- 四:ORM框架Morphia的学习-Datasotre
- 由云台协议DLL浅谈插件程序的编写 .
- 发布cocos2d-x的android版程序
- 对字符串排序,大家看看有什么问题
- QProcess用法
- ruby变量详解