容器是存储检索各类数据的利器,但是STL提供的内容使用起来还是不方便,所以对部分代码做一些封装,而且对于map来说,windows和linux下的用法不一样,曾花了很多时间来编写这个跨平台的map。

正如第一篇所说,由于跨平台代码很难看,只维护了一个Linux的版本,但map是个例外,以后还会有少量例外。

 

1. 对Queue的封装。这个queue并不是最小粒度的封装,我加了一个semaphore,用来实现生产者和消费者模型。

其实也可以把semaphore移到queue之外,和queue本身分开来实现生产者消费者。我是为了效率,为了方便,呵呵,各位就见仁见智吧。

 

Code

 

Mutex的定义如下,用来实现跨平台:

 #ifdef _LINUX_

#include "Sync.h"


typedef ThreadMutex Mutex;
typedef ThreadReadWriteMutex RWMutex;
typedef Semaphore Semaphore;

#elif defined(_WIN32)

#include "CriticalSection.h"
typedef CriticalSection Mutex;

#else


#endif

 

 

DISALLOW_COPY_AND_ASSIGN的宏是参考Google C++ Coding Style,用来限制类型复制和拷贝等对class类型变量的误操作,也可以提高性能,减少编译器自作主张为我们生成一些无法预料的代码。

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
    TypeName(
const TypeName&);               \
    
void operator=(const TypeName&)

使用时,请在class的声明中加入以下的代码:

class A

{

private:

  DISALLOW_COPY_AND_ASSIGN(A);

}

CriticalSection是我对Windows下CRITICAL_SETCION的一个简单封装,只要提供Lock和Unlock接口就好了,Lock就是Enter,Unlock就是Leave,大家可以自己动手封装一下

 

2. 对map的封装

 

 

Code

 

RemoveAllAndDestroy函数有潜在的bug。

因为我是为了自己的应用方便,把HashMap<int, void *>这样用的时候,希望在清除map所有项的同时也释放内存,所以就有这个函数。

另外,可以用读写锁ThreadReadWriteMutex替代Mutex,理论上性能高一点,但没有测试过。我封装了一个RWHashMap,采用读写锁的。跟HashMap类似,就不赘述了。

还有,为了应用方便,还定义了一个BiHashMap,用于双向映射。BiHashMap<K, V> myMap; 里面包含了一个<K, V>的map,还有一个<V, K>的map。有兴趣的给我写邮件吧。

 

3. 对链表的封装(C形式的,借鉴了Codeproject的一个开源系统)

 

Code

 

Node的用处在于可对很多资源做缓存处理。比如网络socket。建立一个socket的系统开销是很大的,所以可以预先把socket创建好,然后放到链表里。

如何使用呢?例如我定义了一个缓冲区类Buffer,我想对这个类做缓存处理,因为内存的分配与释放也是开销很大的。就可以:

class Buffer : public Node

{

}

后面会谈到Buffer类,所以这里就不详述了。

 

 

 

 

 

posted on 2009-05-21 17:51  Napoleon  阅读(735)  评论(0)    收藏  举报