📄 cmap.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 + -