工具类库系列(十二)-ObjectSharedPtrMap

第十二个工具类:ObjectSharedPtrMap


这是继ObjectMap之后,第二个Object对象管理类,管理的是对象的智能指针对象


并且:

1、线程安全。

2、多线程环境下:有一个线程在迭代,其他线程在删除时,迭代不失效


提供的主要接口:

1、增加一个Object的SharedPtr对象:void AddObject(K id, boost::shared_ptr<T> obj);

2、查找一个Object对象,返回该对象的SharedPtr对象(没找到返回SharedPtr(NULL)):boost::shared_ptr<T> FindObject(K id);

3、判断一个Object对象是否存在:bool IsExistsObject(K id);

4、删除一个Object对象:void FreeObject(K id);

5、删除所有(清空)Object对象:void FreeObject();

6、取出并删除一个Object对象:boost::shared_ptr<T> PopObject(K id);

7、获取Object对象的数量:unsigned int GetSize();

8、迭代:boost::shared_ptr<T> BeginObject();  boost::shared_ptr<T> NextObject();


上代码:

ObjectSharedPtrMap.h

#ifndef __ObjectSharedPtrMap_h__
#define __ObjectSharedPtrMap_h__

#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
#include <map>

#include "ToolDefine.h"

namespace common{
	namespace tool{

		// 带键值对的对象管理池
		// 多线程环境下:有一个线程在迭代,其他线程在删除时,迭代不失效
		template <class K, class T>
		class ObjectSharedPtrMap : private boost::noncopyable
		{
		public:
			ObjectSharedPtrMap();
			~ObjectSharedPtrMap();

			// 使用一个空闲结点
			void AddObject(K id, boost::shared_ptr<T> obj);

			// 随机一个结点(分配第一个结点,空列表返回空)
			boost::shared_ptr<T> RandObject();

			// 随机取出一个结点(该节点从map删除)
			boost::shared_ptr<T> PopObject();
			// 取指定结点(该节点从map删除)
			boost::shared_ptr<T> PopObject(K id);

			// 查找一个结点
			boost::shared_ptr<T> FindObject(K id);
			bool IsExistsObject(K id);

			// 释放一个结点
			void FreeObject(K id);
			// 释放所有结点
			void FreeObject();

			// 获取对象个数
			unsigned int GetSize();

			// 迭代
			boost::shared_ptr<T> BeginObject();
			boost::shared_ptr<T> NextObject();

		private:
			rw_mutex m_object_list_lock;

			typedef typename std::map<K, boost::shared_ptr<T> > MapType;
			typedef typename std::map<K, boost::shared_ptr<T> >::iterator MapTypeIterator;

			MapType m_object_list;
			MapTypeIterator m_object_it;
		};

		template <class K, class T>
		ObjectSharedPtrMap<K, T>::ObjectSharedPtrMap()
		{
			write_lock lock(m_object_list_lock);

			m_object_list.clear();
			m_object_it = m_object_list.begin();
		}

		template <class K, class T>
		ObjectSharedPtrMap<K, T>::~ObjectSharedPtrMap()
		{
			write_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.begin();
			while (it != m_object_list.end())
			{
				(it->second).reset();
				it++;
			}

			m_object_list.clear();
			m_object_it = m_object_list.begin();
		}

		template <class K, class T>
		void ObjectSharedPtrMap<K, T>::AddObject(K id, boost::shared_ptr<T> obj)
		{
			if (NULL != obj.get())
			{
				write_lock lock(m_object_list_lock);

				// id已存在的需要提前删除
				MapTypeIterator it = m_object_list.find(id);
				if (it != m_object_list.end())
				{
					// 释放实际数据对象的引用
					(it->second).reset();

					// 删除结点
					if (m_object_it == it)
					{
						m_object_list.erase(m_object_it++);
					}
					else
					{
						m_object_list.erase(it);
					}
				}

				// 添加新对象
				m_object_list[id] = obj;
			}
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::RandObject()
		{
			read_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.begin();
			if (it != m_object_list.end())
			{
				return it->second;
			}
			else
			{
				boost::shared_ptr<T> temp((T*)NULL);
				return temp;
			}
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::PopObject()
		{
			write_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.begin();
			if (it != m_object_list.end())
			{
				boost::shared_ptr<T> temp = it->second;

				// 删除结点
				if (m_object_it == it)
				{
					m_object_list.erase(m_object_it++);
				}
				else
				{
					m_object_list.erase(it);
				}

				return temp;
			}
			else
			{
				boost::shared_ptr<T> temp((T*)NULL);
				return temp;
			}
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::PopObject(K id)
		{
			write_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.find(id);
			if (it != m_object_list.end())
			{
				boost::shared_ptr<T> temp = it->second;

				// 删除结点
				if (m_object_it == it)
				{
					m_object_list.erase(m_object_it++);
				}
				else
				{
					m_object_list.erase(it);
				}

				return temp;
			}
			else
			{
				boost::shared_ptr<T> temp((T*)NULL);
				return temp;
			}
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::FindObject(K id)
		{
			read_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.find(id);
			if (it != m_object_list.end())
			{
				return it->second;
			}
			else
			{
				boost::shared_ptr<T> temp;
				return temp;
			}
		}

		template <class K, class T>
		bool ObjectSharedPtrMap<K, T>::IsExistsObject(K id)
		{
			read_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.find(id);
			if (it != m_object_list.end())
			{
				return true;
			}
			else
			{
				return false;
			}
		}

		template <class K, class T>
		void ObjectSharedPtrMap<K, T>::FreeObject(K id)
		{
			write_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.find(id);
			if (it != m_object_list.end())
			{
				// 释放实际数据对象的引用
				(it->second).reset();

				// 删除结点
				if (m_object_it == it)
				{
					m_object_list.erase(m_object_it++);
				}
				else
				{
					m_object_list.erase(it);
				}
			}
		}

		template <class K, class T>
		void ObjectSharedPtrMap<K, T>::FreeObject()
		{
			write_lock lock(m_object_list_lock);

			MapTypeIterator it = m_object_list.begin();
			while (it != m_object_list.end())
			{
				(it->second).reset();
				it++;
			}

			m_object_list.clear();
			m_object_it = m_object_list.begin();
		}

		template <class K, class T>
		unsigned int ObjectSharedPtrMap<K, T>::GetSize()
		{
			read_lock lock(m_object_list_lock);

			return m_object_list.size();
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::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;
				}
			}

			boost::shared_ptr<T> temp((T*)NULL);
			return temp;
		}

		template <class K, class T>
		boost::shared_ptr<T> ObjectSharedPtrMap<K, T>::NextObject()
		{
			{
				write_lock lock(m_object_list_lock);

				if (m_object_it != m_object_list.end())
				{
					return (m_object_it++)->second;
				}
			}

			boost::shared_ptr<T> temp((T*)NULL);
			return temp;
		}

	}
}

#endif


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值