65,194
社区成员




#include "TransLib.h"
namespace TransLib
{
template <typename Key> class BufferPool;
/* 缓冲区 */
class Buffer
{
//内部定义省略
private:
template <typename Key> friend class BufferPool;
Buffer(const Buffer& buffer);
Buffer& operator=(const Buffer& buffer);
};
namespace TransLib
{
class Buffer; //不晓得为什么,一定要声明,可能有错
class Socket {
public:
#ifdef POSIX
typedef int Target;
#endif
enum ReturnType{
SUCCESS,
NOTEXIST,
TIMEOUT,
SENDING
};
virtual Socket* instance() = 0;
virtual ReturnType init() = 0;
virtual const Target& connect(const char* pHostName, const char* pService) = 0;
virtual ReturnType sendTo(const Target& target, Buffer* pBuffer, const size_t nLength) = 0;
virtual ReturnType receiveFrom(const Target& target, Buffer* pBuffer, size_t* pLength) = 0;
virtual ReturnType close(const Target& target) = 0;
protected:
Socket* _pInstance;
virtual ~Socket() = 0;
};
}
namespace TransLib
{
class Buffer; //不晓得为什么,一定要声明,可能有错
这里错误:forward declaration of ‘struct TransLib::Buffer’
template <typename Key>
class BufferPool
{
};
template<typename Key>
bool BufferPool<Key>::removeBuffer(const Key& key)
{
这里错误:expected ‘;’ before ‘iter’
std::map<Key, Buffer*>::iterator iter = _pBufferMap->find(key);
这里错误:‘iter’ was not declared in this scope
if(iter == _pBufferMap->end())
return false;
else
{
delete iter->second; _pBufferMap->erase(iter);
}
}
}
#ifndef _TRANSLIB_BUFFER_H_
#define _TRANSLIB_BUFFER_H_
#include "TransLib.h"
namespace TransLib
{
template <typename Key> class BufferPool;
/* 缓冲区 */
class Buffer
{
public:
/*
* 将初始地址为pData长度为nSize的内存复制到缓冲区中
* 返回:成功返回true,长度过长溢出,则失败返回false
*/
bool addData(const void* pData, const size_t nSize);
/*
* 将初始地址为pData长度为nSize的内存复制到缓冲区中,
* 若缓冲区大小不足自动增加大小,一定成功(只要内存够)
*/
void addDataSafely(const void* pData, const size_t nSize);
/*
* 删除缓冲区中末端的指定长度的数据,
* 成功返回true,否则长度过长溢出返回false
*/
bool removeData(const size_t nLengthToDelete);
void* getDataStart() const;
void* getDataEnd() const;
void* getLastDataStart(size_t nLength) const;
const size_t getBufferSize() const;
const size_t getDataSize() const;
const size_t resize(const size_t nNewSize);
/* 清空缓冲区 */
void clear();
protected:
/* nBufferSize:缓冲区最大尺寸 */
Buffer(const size_t nBufferSize = MSG_MAX_SIZE);
virtual ~Buffer();
const static size_t _BLANKSIZE = 20; //预申请的内存大小
void* _pBuffer; //缓冲区地址
void* _pDataStart; //缓冲区中有效数据的开始处
void* _pDataEnd; //缓冲区中有效数据的末尾处,新数据的起点处
size_t _nBufferSize; //缓冲区最大长度
private:
//Buffer类只能由BufferPool类实例化
template <typename Key> friend class BufferPool;
Buffer(const Buffer& buffer);
Buffer& operator=(const Buffer& buffer);
};
inline Buffer::~Buffer()
{
free(_pBuffer);
}
inline void* Buffer::getDataStart() const
{
return _pDataStart;
}
inline void* Buffer::getDataEnd() const
{
return _pDataEnd;
}
inline void* Buffer::getLastDataStart(size_t nLength) const
{
return (char*)_pDataEnd - nLength;
}
inline const size_t Buffer::getBufferSize() const
{
return _nBufferSize;
}
inline const size_t Buffer::getDataSize() const
{
return (char*)_pDataEnd - (char*)_pDataStart;
}
inline void Buffer::clear()
{
_pDataEnd = _pDataStart = _pBuffer;
}
}
#endif /* _TRANSLIB_BUFFER_H_ */
#ifndef _TRANSLIB_BUFFERPOOL_H_
#define _TRANSLIB_BUFFERPOOL_H_
#include "TransLib.h"
#include "Buffer.h"
#include <map>
namespace TransLib
{
//class Buffer; //不晓得为什么,一定要声明,可能有错
/* 缓冲区池,一个Key对应一个缓冲区 */
template <typename Key>
class BufferPool
{
public:
/* 创建指定 */
BufferPool(const size_t nMaxSize);
/*
* 获取Buffer,若不存在则创建,大小为nBufferSize
* 若指定缓冲区不在池中,且未指定大小,不能创建,则返回0(即不指定大小,可只返回以存在的缓冲区)
* 若指定缓冲区不在池中,指定大小要创建,但是缓冲池满,则返回0
*/
Buffer* getBuffer(const Key& key, size_t nBufferSize = 0);
/*
* 判断指定的缓冲区是否在缓冲区池中,
* 存在返回true,否则返回false
*/
bool isBufferExist(const Key& key) const;
/*
* 删除指定的Buffer,成功返回true,
* 若指定Buffer不存在,返回false,
*/
bool removeBuffer(const Key& key);
virtual ~BufferPool();
protected:
std::map<Key, Buffer*>* _pBufferMap; /* 由Key指定Buffer */
size_t _nMaxSize; /* 缓冲区池最大容量 */
BufferPool(const BufferPool& bufferPool); //只声明
BufferPool& operator=(const BufferPool& bufferPool); //只声明
};
template<typename Key>
Buffer* BufferPool<Key>::getBuffer(const Key& key,
size_t nBufferSize/* = 0*/)
{
std::map<Key, Buffer*>::iterator iter = _pBufferMap->find(key);
if(iter == _pBufferMap->end()) //指定缓冲区不存在
{
if(nBufferSize == 0) //未指定缓冲区大小,无法创建
return 0;
else
{
if(_pBufferMap->size() == _nMaxSize) //已满
return 0;
else //未满,且不存在,则创建
{
Buffer* pNewBuffer = new Buffer(nBufferSize);
_pBufferMap->insert(
std::pair<Key, Buffer*>(key, pNewBuffer));
return pNewBuffer;
}
}
}
else //指定缓冲区存在
{
return iter->second;
}
}
template<typename Key>
bool BufferPool<Key>::isBufferExist(const Key& key) const
{
std::map<Key, Buffer*>::iterator iter = _pBufferMap->find(key);
if(iter == _pBufferMap->end())
return false;
else
return true;
}
template<typename Key>
bool BufferPool<Key>::removeBuffer(const Key& key)
{
std::map<Key, Buffer*>::iterator iter = _pBufferMap->find(key);
if(iter == _pBufferMap->end())
return false;
else
{
delete iter->second; //删除Buffer
_pBufferMap->erase(iter);
}
}
template<typename Key>
BufferPool<Key>::BufferPool(const size_t nMaxSize)
:_nMaxSize(nMaxSize)
{
_pBufferMap = new std::map<Key, Buffer*>();
}
template<typename Key>
BufferPool<Key>::~BufferPool()
{
std::map<Key, Buffer*>::iterator iter;
for(iter = _pBufferMap->begin(); iter != _pBufferMap->end(); iter++)
delete iter->second;
}
}
#endif /* _TRANSLIB_BUFFERPOOL_H_ */
namespace TransLib
{
template <typename Key> class BufferPool;
/* 缓冲区 */
class Buffer
{
public:
/*
* 将初始地址为pData长度为nSize的内存复制到缓冲区中
* 返回:成功返回true,长度过长溢出,则失败返回false
*/
bool addData(const void* pData, const size_t nSize);
/*
* 将初始地址为pData长度为nSize的内存复制到缓冲区中,
* 若缓冲区大小不足自动增加大小,一定成功(只要内存够)
*/
void addDataSafely(const void* pData, const size_t nSize);
/*
* 删除缓冲区中末端的指定长度的数据,
* 成功返回true,否则长度过长溢出返回false
*/
bool removeData(const size_t nLengthToDelete);
void* getDataStart() const;
void* getDataEnd() const;
const size_t getBufferSize() const;
const size_t getDataSize() const;
const size_t resize(const size_t nNewSize);
/* 清空缓冲区 */
void clear();
virtual ~Buffer();
protected:
/* nBufferSize:缓冲区最大尺寸 */
Buffer(const size_t nBufferSize = MSG_MAX_SIZE);
const static size_t _BLANKSIZE = 20; //预申请的内存大小
void* _pBuffer; //缓冲区地址
void* _pDataStart; //缓冲区中有效数据的开始处
void* _pDataEnd; //缓冲区中有效数据的末尾处,新数据的起点处
size_t _nBufferSize; //缓冲区最大长度
private:
//Buffer类只能由BufferPool类实例化
template <typename Key> friend class BufferPool;
Buffer(const Buffer& buffer);
Buffer& operator=(const Buffer& buffer);
};
}
/*
* TransLib.h
*
* Created on: 2010-4-17
* Author: Peter_ZHA
* for:项目总头文件
*/
#ifndef _TRANSLIB_TRANSLIB_H_
#define _TRANSLIB_TRANSLIB_H_
#ifndef POSIX
#define POSIX
#endif /* POSIX */
#include <stdlib.h>
#include <string.h>
#include <map>
#include "MsgFormat.h"
#include "Buffer.h"
#include "BufferPool.h"
#include "Socket.h"
#include "UDPSocket.h"
extern const size_t MSG_MAX_SIZE;
#endif /* _TRANSLIB_TRANSLIB_H_ */