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

📄 cmap.h

📁 sun Linux 下的网络编程
💻 H
字号:
#ifndef __CMAP_H__
#define __CMAP_H__

#include "cMutex.h"

#include <map>


namespace yyc
{

//处理map对象中的每个元素的回调函数
//在thread_map的do_items中,被调用
//返回值=0,不作处理,=-1删除此item
typedef int(FUNC_DOITEMS)(void *pkey,void *pval,void *args);

template<class K,class V>
class cMap
{
private:
	std::map<K,V *> m_map;
	cMutex m_mutex;
public:
	cMap();
	void clear();
	V *get(const K &key);
	//删除某个key,但不释放value指向的空间
	int remove(const K &key);
	//删除某个key,释放value指向的空间
	int del(const K &key);
	int add(const K &key,V *pv);
	void do_items(FUNC_DOITEMS *pfunc,void *args);
   // void dump(VAL_DUMP *pfunc);
	~cMap();
	int size()
	{
		return m_map.size();
	}
	
};

template< class K,class V >
cMap<K,V>::cMap()
{
}
template< class K,class V >
void cMap< K,V >::clear()
{
	m_mutex.lock();
	if(!m_map.empty())
	{
		std::map<K,V *>::iterator it=m_map.begin();
	 	for(;it!=m_map.end();it++) 
		 	delete (*it).second;
	 	m_map.clear();
	}
	
	m_mutex.unlock();
}
template< class K,class V >
V * cMap< K,V >::get(const K &key)
{
	V *pv=NULL;
	m_mutex.lock();
	if(m_map.count(key)>=1)
	{
		pv=m_map[key];
	}
	m_mutex.unlock();
	return pv;
}
//删除某个key,但不释放value指向的空间
template< class K,class V >
int cMap< K,V >::remove(const K &key)
{
	int retv=0;
	m_mutex.lock();
	m_map.erase(key);
	retv=m_map.size();
	m_mutex.unlock();
	return retv;
}
//删除某个key,释放value指向的空间
template< class K,class V >
int cMap< K,V >::del(const K &key)
{
	int retv=0;
	m_mutex.lock();
	if(m_map.count(key)>=1)
	{
		delete m_map[key];
		m_map.erase(key);
	}
	retv=m_map.size();
	m_mutex.unlock();
	return retv;
}
template< class K,class V >
int cMap< K,V >::add(const K &key,V *pv)
{
	int retv=0;
	if (pv==NULL) return -1;
	m_mutex.lock();
	if (m_map.count(key)>=1)
			delete m_map[key];
	m_map[key]=pv;
	retv=m_map.size();
	m_mutex.unlock();
	return retv;
}
template< class K,class V >
void cMap< K,V >::do_items(FUNC_DOITEMS *pfunc,void *args)
{
	int ret;
	if(pfunc!=NULL)
	{
		V *pv=NULL;
		K *pk=NULL;
		m_mutex.lock();
		if(!m_map.empty())
		{
			map<K,V *>::iterator it=m_map.begin();
			 for(;it!=m_map.end();it++)
			 {
				 pk=const_cast<K *>(&((*it).first));
				 pv=(*it).second;
				 ret=(*pfunc)((void *)pk,(void *)pv,args);
				 if(ret<0) m_map.erase((*it).first);
			 }
		}
		m_mutex.unlock();
	}//?if(pfunc!=NULL)
}

template< class K,class V >
cMap<K,V>::~cMap()
{
	clear();
}

}//?namespace yyc
#endif




⌨️ 快捷键说明

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