arraylisttest.cpp

来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 318 行

CPP
318
字号
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <ndb_global.hpp>#include <ArrayList.hpp>#include <NdbOut.hpp>#include <NdbTick.h>struct A_Listable_Object {  Uint32 next;  Uint32 prev;  char somedata[12];  void print (NdbOut & out) {    out << "ALO: next = " << next	<< " prev = " << prev << endl;  }};extern const int x_AL_Next = offsetof(A_Listable_Object, next);extern const int x_AL_Prev = offsetof(A_Listable_Object, prev);NdbOut &operator<<(NdbOut & o, A_Listable_Object & a){  a.print(o);  return o;}typedef Ptr<A_Listable_Object> A_Listable_ObjectPtr;#define APool ArrayPool<A_Listable_Object>#define AList ArrayList<A_Listable_Object>APool aGPool;AList aGList(aGPool);class ArrayListTest {public:  static void tryList0(int listSize){    APool aPool;    AList aList(aPool);    if(!aPool.setSize(listSize)){      ndbout << "Failed to do aPool.setSize(" << listSize << ")" << endl;      return;    }        int * anArray = new int[listSize];        for(int i = 1; i<listSize; i++){      int arrayElements = 0;            for(int j = 0; j<i; j++){	A_Listable_ObjectPtr p;	const int ret = aList.seize(p);	if(ret == RNIL){	  ndbout << "Failed to seize!!"  << endl;	  ndbout << "Have seized " << j		 << " out of " << listSize << endl;	  ndbout << "Terminating..." << endl;	  abort();	}	anArray[arrayElements] = ret;	arrayElements++;      }      assert(aList.noOfElements() == i);      assert(aPool.noOfFree() == (listSize - i));      assert(arrayElements == i);      for(int j = 0; j<i; j++){	aList.release(anArray[j]);      }            assert(aList.noOfElements() == 0);      assert(aPool.noOfFree() == listSize);    }  }  static void tryList1(int listSize, int iterations){    APool aPool;    AList aList(aPool);        if(!aPool.setSize(listSize)){      ndbout << "Failed to do aPool.setSize(" << listSize << ")" << endl;      return;    }        ndbout << "Seizing/Releaseing " << iterations 	   << " times over list with " << listSize << " elements" << endl;        int * anArray = new int[listSize];    int arrayElements = 0;        int noOfSeize = 0;    int noFailSeize = 0;    int noOfRelease = 0;        for(int i = 0; i<iterations; i++){      assert(arrayElements <= listSize);      const int r = rand() % (10 * listSize);      if(r < (arrayElements - 1)){	/**	 * Release an element	 */	noOfRelease++;	aList.release(anArray[r]);	arrayElements--;	for(int j = r; j<arrayElements; j++)	  anArray[j] = anArray[j+1];	      } else {	/**	 * Seize an element	 */	A_Listable_ObjectPtr p;	const int ret = aList.seize(p);	if(ret == RNIL && arrayElements != listSize){	  ndbout << "Failed to seize!!" 		 << " iteration=" << i << endl;	  ndbout << "Have seized " << arrayElements 		 << " out of " << listSize << endl;	  ndbout << "Terminating..." << endl;	  abort();	}	if(arrayElements >= listSize && ret != RNIL){	  ndbout << "Seize did not fail when it should have"		 << " iteration=" << i << endl;	  ndbout << "Have seized " << arrayElements 		 << " out of " << listSize << endl;	  ndbout << "Terminating..." << endl;	  abort();	}	if(ret != RNIL){	  noOfSeize++;	  anArray[arrayElements] = ret;	  arrayElements++;	} else {	  noFailSeize++;	}      }    }    delete []anArray;      ndbout << "Seized: " << noOfSeize 	   << " Seized with buffer full: " << noFailSeize 	   << " Release: " << noOfRelease << " --- ";    ndbout << "(" << noOfSeize << " + " << noFailSeize << " + " << noOfRelease 	   << " = " << (noOfSeize + noFailSeize + noOfRelease) << ")" << endl;  }  static void tryList2(int size, int iter, int fail){    APool aPool;    AList aList(aPool);      if(!aPool.setSize(size)){      ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;      return;    }      ndbout << "doing getPtr(i) where i > size(" << size << ") " 	   << fail << " times mixed with " << iter 	   << " ordinary seize/release" << endl;    int * anArray = new int[size];    int arrayElements = 0;      int noOfSeize = 0;    int noFailSeize = 0;    int noOfRelease = 0;    for(int i = 0; i<iter; i++){      assert(arrayElements <= size);      const int r = rand() % (10 * size);      if((i + 1)%(iter/fail) == 0){	aList.getPtr(size + r);	continue;      }          if(r < (arrayElements - 1)){	/**	 * Release an element	 */	noOfRelease++;	aList.release(anArray[r]);	arrayElements--;	for(int j = r; j<arrayElements; j++)	  anArray[j] = anArray[j+1];      } else {	/**	 * Seize an element	 */	A_Listable_ObjectPtr p;	const int ret = aList.seize(p);	if(ret == RNIL && arrayElements != size){	  ndbout << "Failed to seize!!" 		 << " iteration=" << i << endl;	  ndbout << "Have seized " << arrayElements 		 << " out of " << size << endl;	  ndbout << "Terminating..." << endl;	  abort();	}	if(arrayElements >= size && ret != RNIL){	  ndbout << "Seize did not fail when it should have"		 << " iteration=" << i << endl;	  ndbout << "Have seized " << arrayElements 		 << " out of " << size << endl;	  ndbout << "Terminating..." << endl;	  abort();	}	if(ret != RNIL){	  noOfSeize++;	  anArray[arrayElements] = ret;	  arrayElements++;	} else {	  noFailSeize++;	}      }    }    delete []anArray;  }  static void  tryList3(int size, int fail){    ndbout << "Failing " << fail << " times " << endl;    for(int i = 0; i<fail; i++){      APool aPool;      AList aList(aPool);          if(!aPool.setSize(size)){	ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;	return;      }      const int noOfElementsInBufferWhenFail = (i + 1) * (size /(fail + 1));      int * anArray = new int[size];      for(int i = 0; i<size; i++)	anArray[i] = i;      int arrayElements = 0;          int noOfSeize = 0;      int noFailSeize = 0;      int noOfRelease = 0;          while(true){	assert(arrayElements <= size);	if(arrayElements == noOfElementsInBufferWhenFail){	  ndbout << "++ You should get a ErrorReporter::handle... " << endl;	  aList.release(anArray[arrayElements]);	  ndbout << "++ Inbetween these lines" << endl << endl;	  break;	}	const int r = rand() % (10 * size);	if(r < (arrayElements - 1)){	  /**	   * Release an element	   */	  noOfRelease++;	  aList.release(anArray[r]);	  arrayElements--;	  for(int j = r; j<arrayElements; j++)	    anArray[j] = anArray[j+1];		} else {	  /**	   * Seize an element	   */	  A_Listable_ObjectPtr p;	  const int ret = aList.seize(p);	  if(ret == RNIL && arrayElements != size){	    ndbout << "Failed to seize!!" << endl;	    ndbout << "Have seized " << arrayElements 		   << " out of " << size << endl;	    ndbout << "Terminating..." << endl;	    abort();	  }	  if(arrayElements >= size && ret != RNIL){	    ndbout << "Seize did not fail when it should have" << endl;	    ndbout << "Have seized " << arrayElements 		   << " out of " << size << endl;	    ndbout << "Terminating..." << endl;	    abort();	  }	  if(ret != RNIL){	    noOfSeize++;	    anArray[arrayElements] = ret;	    arrayElements++;	  } else {	    noFailSeize++;	  }	}      }      delete []anArray;    }    }};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?