65,189
社区成员




void * CCBufferMgr::askOneBuffer( int bufSize )
{
int size = unusedBufVec.size();
if(size < 1)
return NULL;
for(int i = 0; i < size; ++i)
{
BufInfo bufInfo = unusedBufVec[i];
if(bufSize <= bufInfo.size)
{
if(bufSize < bufInfo.size)
{
BufInfo extraBuf = {(char *)bufInfo.buf + bufSize, bufInfo.size - bufSize};
unusedBufVec.push_back(extraBuf);
}
bufInfo.size = bufSize;
usedBufVec.push_back(bufInfo);
//unusedBufVec.erase(&unusedBufVec[i]);
unusedBufVec.erase(unusedBufVec.begin() + i);
return bufInfo.buf;
}
}
return NULL;
}
bool CCBufferMgr::returnBackBuffer( void * buf )
{
for(int i = 0; i < usedBufVec.size(); ++i)
{
BufInfo bufInfo = usedBufVec[i];
if(bufInfo.buf == buf)
{
//usedBufVec.erase(&usedBufVec[i]);
usedBufVec.erase(usedBufVec.begin() + i);
unusedBufVec.push_back(bufInfo);
return true;
}
}
return false;
}
void CCBufferMgr::askTwoBuffer( void ** bufOne, int sizeOne, void ** bufTwo , int sizeTwo)
{
void * buf = askOneBuffer(sizeOne);
if(buf == NULL)
{
*bufOne = *bufTwo = NULL;
return;
}
*bufOne = buf;
buf = askOneBuffer(sizeTwo);
if(buf == NULL)
{
*bufTwo = NULL;
}
}
void CCBufferMgr::show() const
{
std::cout << "CCBufferMgr " << this << ": " << std::endl;
for(int i = 0; i < usedBufVec.size(); ++i)
{
const BufInfo * info = &usedBufVec[i];
std::cout << "Used BufInfo: " << info->buf << ", " << info->size << std::endl;
}
for(int i = 0; i < unusedBufVec.size(); ++i)
{
const BufInfo * info = &unusedBufVec[i];
std::cout << "Unused BufInfo: " << info->buf << ", " << info->size << std::endl;
}
std::cout << std::endl;
}
void CCBufferMgr::setReallocSizeUnit( int newReallocSizeUnit )
{
// usedBufVec.setReallocSizeUnit(newReallocSizeUnit);
// unusedBufVec.setReallocSizeUnit(newReallocSizeUnit);
}
#ifndef CC_BUFFER_MGR_H
#define CC_BUFFER_MGR_H
//#include "ccCommon.h"
//#include "ccVector.h"
#include <vector>
#include <iostream>
using namespace std;
typedef struct _BufInfo
{
void * buf;
int size;
}BufInfo;
class CCBufferMgr
{
public:
CCBufferMgr(int size = /*PAGE_SIZE*/ 4096):size(size)
{
buf = new char[size];
BufInfo bufInfo = {buf, size};
unusedBufVec.push_back(bufInfo);
// usedBufVec.setReallocSizeUnit(1024);
// unusedBufVec.setReallocSizeUnit(1024);
}
~CCBufferMgr()
{
delete []buf;
}
public:
int getSize() const { return size; }
void * getBufPtr() const { return buf; }
public:
void * askOneBuffer(int bufSize); // if no avaiable buf, return NULL
bool returnBackBuffer(void * buf); // if return false, the buf isn't allocated from the mgr, it will do nothing
public:
void show() const;
public:
void setReallocSizeUnit(int newReallocSizeUnit);
private:
void askTwoBuffer( void ** bufOne, int sizeOne, void ** bufTwo , int sizeTwo);
private:
CCBufferMgr(const CCBufferMgr & bufMgr);
CCBufferMgr & operator=(const CCBufferMgr & bufMgr);
private:
void * buf;
int size;
//CCVector<BufInfo> usedBufVec;
//CCVector<BufInfo> unusedBufVec;
vector<BufInfo> usedBufVec;
vector<BufInfo> unusedBufVec;
};
#endif