工具类库系列(十一)-ObjectMap
来源:互联网 发布:爱淘宝官网 编辑:程序博客网 时间:2024/06/06 10:46
第十一个工具类:ObjectMap
ObjectMap 是一个上篇提到的 objectid64 的一个id<->id映射关系表,由map实现
该类用于需求中时常会出现的 1对1 或者 1对多 映射关系,
比如:
1对1:一个网络链接对象 对应 一个玩家数据对象, 一个玩家数据对象 也对应一个 网络链接对象
1对多:一个玩家对象 对应 一个游戏公会对象
同时:
1、继承boost::noncopyable,禁止ObjectMap对象间拷贝赋值
2、ObjectMap加了锁,确保操作是线程安全了
3、实现了当一个线程在对ObjectMap进行迭代,其他线程在对ObjectMap进行添加/删除,确保迭代不失效
如何实现保证迭代不失效:
ObjectMap中保存了迭代时当前的迭代器std::map::iterator对象
当做删除操作时,先检查下要删除的这个对象是否就是当前正在遍历的那个对象
是的话,则保存的迭代器后移,再删除
提供的主要接口:
1、增加一个id<->id的映射关系:void AddObject(objectid64 key, objectid64 value);
2、查找一个id<->id映射关系(没找到返回NULL_ID):objectid64 FindObject(objectid64 key);
3、判断一个id<->id映射关系是否存在:bool IsExistsObject(objectid64 key);
4、删除一个id<->id映射关系:void FreeObject(objectid64 key);
5、获取id<->id映射关系的数量:unsigned int GetSize();
6、迭代:objectid64 BeginObject(); objectid64 NextObject();
上代码:
ObjectMap.h
#ifndef __ObjectMap_h__#define __ObjectMap_h__#include <boost/noncopyable.hpp>#include <map>#include "ToolDefine.h"namespace common{namespace tool{// 纯uint64的键值对池// 主要用于id对id的索引class ObjectMap : private boost::noncopyable{public:ObjectMap();~ObjectMap();// 使用一个空闲结点void AddObject(objectid64 key, objectid64 value);// 随机一个结点(分配第一个结点,空列表返回空)objectid64 RandObject();// 查找一个结点(没找到返回空)objectid64 FindObject(objectid64 key);bool IsExistsObject(objectid64 key);// 释放一个结点void FreeObject(objectid64 key);// 获取对象个数unsigned int GetSize();// 迭代objectid64 BeginObject();objectid64 NextObject();private:rw_mutex m_object_list_lock;typedef std::map<objectid64, objectid64> MapType;typedef std::map<objectid64, objectid64>::iterator MapTypeIterator;MapType m_object_list;MapTypeIterator m_object_it;};}}#endif
ObjectMap.cpp
#include "ObjectMap.h"namespace common{namespace tool{ObjectMap::ObjectMap(){write_lock lock(m_object_list_lock);m_object_list.clear();m_object_it = m_object_list.begin();}ObjectMap::~ObjectMap(){write_lock lock(m_object_list_lock);m_object_list.clear();m_object_it = m_object_list.begin();}void ObjectMap::AddObject(objectid64 key, objectid64 value){write_lock lock(m_object_list_lock);m_object_list[key] = value;}objectid64 ObjectMap::RandObject(){read_lock lock(m_object_list_lock);MapTypeIterator it = m_object_list.begin();if (it != m_object_list.end()){return it->second;}else{return NULL_ID;}}objectid64 ObjectMap::FindObject(objectid64 key){read_lock lock(m_object_list_lock);MapTypeIterator it = m_object_list.find(key);if (it != m_object_list.end()){return it->second;}else{return NULL_ID;}}bool ObjectMap::IsExistsObject(objectid64 key){read_lock lock(m_object_list_lock);MapTypeIterator it = m_object_list.find(key);if (it != m_object_list.end()){return true;}else{return false;}}void ObjectMap::FreeObject(objectid64 key){write_lock lock(m_object_list_lock);MapTypeIterator it = m_object_list.find(key);if (it != m_object_list.end()){// 删除结点if (m_object_it == it){m_object_list.erase(m_object_it++);}else{m_object_list.erase(it);}}}unsigned int ObjectMap::GetSize(){read_lock lock(m_object_list_lock);return m_object_list.size();}objectid64 ObjectMap::BeginObject(){write_lock lock(m_object_list_lock);m_object_it = m_object_list.begin();if (m_object_it != m_object_list.end()){return (m_object_it++)->second;}else{return NULL_ID;}}objectid64 ObjectMap::NextObject(){write_lock lock(m_object_list_lock);if (m_object_it != m_object_list.end()){return (m_object_it++)->second;}else{return NULL_ID;}}}}
其中ToolDefine.h增加了定义读写锁
//读写锁typedef boost::shared_mutex rw_mutex;typedef boost::shared_lock<rw_mutex> read_lock;typedef boost::unique_lock<rw_mutex> write_lock;
- 工具类库系列(十一)-ObjectMap
- 工具类库系列(一)-StringTool
- 工具类库系列(二)-ExePath
- 工具类库系列(三)-IniReader
- 工具类库系列(四)-CsvReader
- 工具类库系列(五)-Timer
- 工具类库系列(六)-TimeTool
- 工具类库系列(七)-Logger
- 工具类库系列(八)-WinService
- 工具类库系列(九)-ReflectEnum
- 工具类库系列(十)-Object
- 工具类库系列(十二)-ObjectSharedPtrMap
- 工具类库系列(十三)-ObjectSharedPtrMap2
- 工具类库系列(十四)-FileData
- [Play with T]_[C# 类与属性操作] ObjectMap 方法 将TTfrom类的对象转换为TEntity对象
- [Play with T]_[C# 类与属性操作] 通过克隆实现ObjectMap对List的填充
- 工具类系列-JavaBean2Map
- 工具类系列-ClazzReflectUtil
- 关于在部署jsp网站时遇到问题:MySql连接不上、Tomcat的闪退
- 栈
- Qt资料大全
- JS学习
- 2017如何下载Youtube视频?1080p 4K
- 工具类库系列(十一)-ObjectMap
- shader学习心得
- 【OpenCV学习笔记】二、深入了解 cv::Mat
- Spring Cloud 坑点
- MongoDB WiredTiger 存储引擎cache_pool设计 (下) -- 实践篇
- Java编程简单应用———1、HelloWorld(HelloWorld的来源);2、输出个人信息3、输出特殊图案
- 《JAVA与模式》之观察者模式
- leg附件下载
- 浅论软件测试