本文共 4382 字,大约阅读时间需要 14 分钟。
.H内容如下:
-
-
-
-
-
-
- //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
-
- class MemTable
- {
- public:
- MemTable(void);
- public:
- ~MemTable(void);
- public:
- void CREATE(MemTableIn *in_m);
- void DEL();
- LPSTR NEW();
- LPSTR NEW_CONTINUEOUS(UINT n);
- UINT NEW(UINT n);
- LPSTR GET(UINT n);
- int get_totle_unitnum();
- public:
- MemTableIn in;
- LPSTR **pDouble_Indirect;
- LPSTR lpBitmap;
- LPSTR *pIndirect;
-
- LPSTR m_lpFirstFree;
- int nFree[3];
- INT32 m_EndBlkUseredUnits;
- int m_Vblkbytes;
- UINT m_UnitTotalNum;
- UINT m_log2Rindexs,m_log2Runits,m_log2Rbitmap,m_log2Lindexs,m_log2Lunits,m_log2Lbitmap;
- UINT m_log2UnitBytes;
- UINT m_index2ID,m_index1ID,m_UnitID;
- };
.CPP内容如下:
-
-
-
-
-
-
-
-
-
- int ffs(int x)
- {
- int r = 1;
-
- if (!x)
- return 0;
- if (!(x & 0xffff)) {
- x >>= 16;
- r += 16;
- }
- if (!(x & 0xff)) {
- x >>= 8;
- r += 8;
- }
- if (!(x & 0xf)) {
- x >>= 4;
- r += 4;
- }
- if (!(x & 3)) {
- x >>= 2;
- r += 2;
- }
- if (!(x & 1)) {
- x >>= 1;
- r += 1;
- }
- return r;
- }
- LPSTR MemTree::GET(MemTreeHead *pHead,UINT n)
- {
- int t;
- LPSTR lpt;
- int i,ii;
-
- if(n<m.rootDirectUnitNum)
- return pHead->lpRootUnit + n*m.Vsizeof;
- else
- t=n-m.rootDirectUnitNum;
-
- for(i=1;i<DEEP;i++)
- {
- if(t<TBT[i][0])
- break;
- t-=TBT[i][0];
- }
-
- lpt=pHead->pROOT_INDEX[i-1];
- int D;
- for(ii=1;ii<i;ii++)
- {
- D=t /TBT[i][ii];
- t=t % TBT[i][ii];
- lpt=*(LPSTR*)(lpt+sizeof(LPSTR)*D);
- }
- return (lpt + t*m.Vsizeof);
-
- }
-
- MemTable::MemTable(void)
- {
- }
-
- MemTable::~MemTable(void)
- {
-
- for(int i=0;i<in.nIndexNum;i++)
- {
- LPSTR *pp=pDouble_Indirect[i];
- if(pp==NULL)
- break;
- for(int ii=0;ii<in.nIndexNum;ii++)
- {
- LPSTR p=pp[ii];
- if(p==NULL)
- break;
- else
- delete [] p;
- }
- delete [] pp;
- }
- delete [] pDouble_Indirect;
- }
- void MemTable::CREATE(MemTableIn *in_m)
- {
-
- memset(&in,0,sizeof(in));
- in=*in_m;
- m_UnitTotalNum=0;
- nFree[0]=nFree[1]=nFree[2]=0;
-
- m_Vblkbytes= in.nUnitBytes *in.nUnitPerIndex;
- m_log2Runits=ffs(in.nUnitPerIndex)-1;
- m_log2Rindexs=ffs(in.nIndexNum)-1;
- m_log2UnitBytes=ffs(in.nUnitBytes)-1;
-
- m_log2Lindexs=sizeof(UINT)*8-m_log2Rindexs;
- m_log2Lunits=sizeof(UINT)*8-m_log2Runits;
-
-
-
-
- pDouble_Indirect=new LPSTR* [in.nIndexNum];
- memset(pDouble_Indirect,0,in.nIndexNum*sizeof(LPSTR));
- nFree[0]=in.nIndexNum;
- }
- LPSTR MemTable::NEW()
- {
- LPSTR lpReturn;
- if(nFree[2]==0)
- {
- if(nFree[1]==0)
- {
- if(nFree[0]==0)
- return NULL;
-
- pIndirect=pDouble_Indirect[in.nIndexNum - nFree[0]]=new LPSTR [in.nIndexNum];
- memset(pIndirect,0,in.nIndexNum*sizeof(LPSTR));
- nFree[1]=in.nIndexNum-1;
-
- lpReturn=pIndirect[0]=new char[m_Vblkbytes];
- memset(lpReturn,0,m_Vblkbytes);
- nFree[2]=in.nUnitPerIndex-1;
- m_lpFirstFree = lpReturn + in.nUnitBytes;
- nFree[0]--;
-
- }
- else
- {
- lpReturn=pIndirect[in.nIndexNum - nFree[1]]=new char[m_Vblkbytes];
- memset(lpReturn,0,m_Vblkbytes);
- nFree[1]--;
- nFree[2]=in.nUnitPerIndex-1;
- m_lpFirstFree = lpReturn + in.nUnitBytes;
- }
- }
- else
- {
- lpReturn=m_lpFirstFree;
- nFree[2]--;
- m_lpFirstFree += in.nUnitBytes;
- }
- m_UnitTotalNum++;
- return lpReturn;
-
- }//by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
- UINT MemTable::NEW(UINT n)
- {
- UINT nReturn=m_UnitTotalNum;
- for(int i=0;i<n;i++)
- NEW();
- return nReturn;
-
- }
- LPSTR MemTable::NEW_CONTINUEOUS(UINT n)
- {
- LPSTR lpReturn;
- if(n>in.nUnitPerIndex)
- return NULL;
-
- if(nFree[2]>=n)
- {
- nFree[2]-=n;
- lpReturn=m_lpFirstFree;
- m_UnitTotalNum+=n;
- m_lpFirstFree += (n*in.nUnitBytes);
- }
- else
- {
- m_UnitTotalNum+=nFree[2];
- nFree[2]=0;
- lpReturn=NEW();
- nFree[2] -= (n-1);
- m_lpFirstFree += ((n-1)*in.nUnitBytes);
- m_UnitTotalNum += (n-1);
- }
- return lpReturn;
- }
- LPSTR MemTable::GET(UINT n)
- { //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
- if(n>=m_UnitTotalNum)
- return NULL;
- m_UnitID=n<< m_log2Lunits >>m_log2Lunits;
- m_index1ID=n >> m_log2Runits;
- m_index2ID=m_index1ID >> m_log2Rindexs;
- m_index1ID=m_index1ID <<m_log2Lindexs >>m_log2Lindexs;
-
- return (pDouble_Indirect[m_index2ID][m_index1ID] + (m_UnitID<<m_log2UnitBytes));
-
- }
- void MemTable::DEL()
- {
-
-
- }
本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/680592,如需转载请自行联系原作者