#ifndef __PPTR_BUFFER_H__
#define __PPTR_BUFFER_H__
/*
filename: pptr_buffer.h
*/
#include <string.h>
template<int MAX_BUF_SIZE, int MAX_PTR_SIZE>
struct pptr_buffer
{
/*
方便在栈中使用char**类型临时变量, 减少服务器内存碎片/缓存复杂度
例:
pptr_buffer<1024, 10> ppbuf;
ppbuf.add("val1");
ppbuf.add("val2");
ppbuf.add("val3");
ppbuf.add("val4");
char** pptr = ppbuf.pptr;
*/
char* pptr[MAX_PTR_SIZE];
int plen[MAX_PTR_SIZE];
int datacount;
pptr_buffer();
bool add(char* val, int len=0);
void reset();
private:
char buff[MAX_BUF_SIZE];
};
///////////////////////////////////////////////////////////////////////////
template<int MAX_BUF_SIZE, int MAX_PTR_SIZE>
pptr_buffer<MAX_BUF_SIZE, MAX_PTR_SIZE>::pptr_buffer()
{
reset();
}
template<int MAX_BUF_SIZE, int MAX_PTR_SIZE>
inline bool pptr_buffer<MAX_BUF_SIZE, MAX_PTR_SIZE>::add(char* val, int len=0)
{
if(datacount >= MAX_PTR_SIZE)
return false;
if(!val)
return false;
if(len<=0)
len = strlen(val);
char* pw;
int wl = len + 1;
int rl = 0;
if(datacount == 0)
{
rl = MAX_BUF_SIZE;
if(wl>rl)
return false;
pw = buff;
}
else
{
rl = MAX_BUF_SIZE - (pptr[datacount-1] - buff + plen[datacount]);
if(wl>rl)
return false;
pw = pptr[datacount-1] + plen[datacount-1] + 1;
}
pptr[datacount] = pw;
memcpy(pw, val, len);
pw[len] = 0;
plen[datacount] = len;
datacount ++;
return true;
}
template<int MAX_BUF_SIZE, int MAX_PTR_SIZE>
inline void pptr_buffer<MAX_BUF_SIZE, MAX_PTR_SIZE>::reset()
{
for(int i=0; i<MAX_PTR_SIZE+1; i++)
{
pptr[i] = 0;
plen[i] = 0;
}
datacount = 0;
}
#endif//__PPTR_BUFFER_H__