示例#1
0
//测试函数
void Test()
{
	HashTable T;
	InitTable(&T);
	//插入序列
	int pIn[13] = { 0, 3, 6, 5, 7, 10, 23, 89, 100, 111, 81,91,93};
	//int pIn[10] = { 0, 3, 6, 5, 7, 10, 23, 89, 100, 111};

	//搜索序列
	int pSe[11] = {11, 3, 6, 5, 7, 0 , 23, 89, 100, 111, 80 };
	
	printf("插入序列:\n");
	for (int i = 0; i < 13; i++)
	{
		printf("%d- ",i);
		InsertToTable(&T, pIn[i]);
	}
	
	printf("\n搜索序列:\n");
	for (int i = 0; i < 11; i++)
	{
		int nCom = 0;
		printf("%d- ",i);
		printf("目标:%3d 哈希值:%2d 结果: %2d",pSe[i],GetHash(T,pSe[i]),SearchTable(T, pSe[i], &nCom));
		printf(" 比较:%3d\n", nCom);
	}
	
	DestroyTable(&T);
}
示例#2
0
//______________________________________________________________________________
Bool_t ROMEXMLDataBase::Write(ROMEStr2DArray* values,const char *dataBasePath,Long64_t runNumber,Long64_t eventNumber)
{
   int i,j;
   char *cstop;

   ROMEStr2DArray fieldArray;
   ROMEStrArray valueArr;
   ROMEString xmlPath;
   ROMEPath *path = new ROMEPath();
   ROMEString vTemp;

   int retValue = SearchTable(path,values,dataBasePath,runNumber,eventNumber,true);

   if (retValue==0) {
      delete path;
      return false;
   }
   if (retValue==-1) {
      delete path;
      return true;
   }

   // handle folder array
   if (retValue==2) {
      if (path->IsFieldArray()) {
/*         for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) {
            xmlPath = fXMLBase;
            xmlPath += path->GetFieldName();
            xmlPath.AppendFormatted("__%d",j);
            if (!xml->GetPathValues(xmlPath,&valueArr)) {
               ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data());
               delete path;
               return false;
            }
            if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) {
               ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1));
               delete path;
               return false;
            }
            for (k=0;k<valueArr.GetEntriesFast();k++) {
               int idxValue = strtol(fIDX.At(k).Data(),&cstop,10);
               if (idxValue>=0)
                  fieldArray.SetAt(valueArr.At(k),j,idxValue);
            }
         }*/
      }
      else {
         for (i=0;i<fIDX.GetEntriesFast();i++) {
            xmlPath = fXMLBase;
            xmlPath.InsertFormatted(xmlPath.Length()-1,"[idx=%ld]",strtol(fIDX.At(i).Data(),&cstop,10));
            xmlPath += path->GetFieldName();
            path->Decode(xmlPath.Data(),0,eventNumber);
            vTemp = values->At(i,0);
            if (!WriteValue(path,fXMLBase,vTemp,-1)) {
               delete path;
               return false;
            }
         }
      }
   }
   // handle single folder
   else {
      if (path->IsFieldArray()) {
         for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) {
            vTemp = values->At(0,j);
            if (!WriteValue(path,fXMLBase,vTemp,j)) {
               delete path;
               return false;
            }
         }
      }
      else {
         vTemp = values->At(0,0);
         if (!WriteValue(path,fXMLBase,vTemp,-1)) {
            delete path;
            return false;
         }
      }
   }
   xml->WritePathFile(fFileName.Data());
   delete path;
   return true;
}
示例#3
0
//______________________________________________________________________________
Bool_t ROMEXMLDataBase::Read(ROMEStr2DArray *values,const char *dataBasePath,Long64_t runNumber,Long64_t eventNumber)
{
   int i,ii,j,k,indx;
   char *cstop;

   ROMEStr2DArray fieldArray;
   ROMEStrArray valueArr;
   ROMEString xmlPath;
   ROMEPath *path = new ROMEPath();

   int retValue = SearchTable(path,values,dataBasePath,runNumber,eventNumber,false);

   if (retValue==0) {
      delete path;
      return false;
   }
   if (retValue==-1) {
      delete path;
      return true;
   }

   // handle folder array
   if (retValue==2) {
      if (path->IsFieldArray()) {
         for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) {
            xmlPath = fXMLBase;
            xmlPath += path->GetFieldName();
            xmlPath.AppendFormatted("__%d",j);
            if (!xml->GetPathValues(xmlPath,&valueArr)) {
               ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data());
               delete path;
               return false;
            }
            if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) {
               ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1));
               delete path;
               return false;
            }
            for (k=0;k<valueArr.GetEntriesFast();k++) {
               int idxValue = strtol(fIDX.At(k).Data(),&cstop,10);
               if (idxValue>=0)
                  fieldArray.SetAt(valueArr.At(k),j,idxValue);
            }
         }
      }
      else {
         xmlPath = fXMLBase;
         xmlPath += path->GetFieldName();
         if (!xml->GetPathValues(xmlPath,&valueArr)) {
            ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data());
            delete path;
            return false;
         }
         if (valueArr.GetEntriesFast()!=fIDX.GetEntriesFast()) {
            ROMEPrint::Error("\nInvalid Table : %s\n", path->GetTableNameAt(path->GetNumberOfTables()-1));
            delete path;
            return false;
         }
         for (j=0;j<valueArr.GetEntriesFast();j++) {
            int idxValue = strtol(fIDX.At(j).Data(),&cstop,10);
            if (idxValue>=0)
               fieldArray.SetAt(valueArr.At(j),0,idxValue);
         }
      }
      for (ii=path->GetOrderIndexAt(0);ii<=path->GetOrderIndexAt(1);ii=ii+path->GetOrderIndexAt(2)) {
         indx = ii;
         for (i=fOrderTableIndex;i<path->GetNumberOfTables();i++) {
            // add field
            if (i==path->GetNumberOfTables()-1) {
               // field array
               if (path->IsFieldArray()) {
                  for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) {
                     values->SetAt(fieldArray.At(j,indx),ii-path->GetOrderIndexAt(0),j);
                  }
               }
               // single field
               else {
                  values->SetAt(fieldArray.At(0,indx),ii-path->GetOrderIndexAt(0),0);
               }
            }
            else {
               indx = strtol(fPointerArray.At(i-fOrderTableIndex,indx).Data(),&cstop,10);
            }
         }
      }
   }
   // handle single folder
   else {
      if (path->IsFieldArray()) {
         for (j=path->GetFieldIndexAt(0);j<=path->GetFieldIndexAt(1);j=j+path->GetFieldIndexAt(2)) {
            xmlPath = fXMLBase;
            xmlPath += path->GetFieldName();
            xmlPath.AppendFormatted("__%d",j);
            if (!xml->GetPathValues(xmlPath,&valueArr)) {
               ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data());
               delete path;
               return false;
            }
            values->SetAt(valueArr.At(0),0,j-path->GetFieldIndexAt(0));
         }
      }
      else {
         xmlPath = fXMLBase;
         xmlPath += path->GetFieldName();
         if (!xml->GetPathValues(xmlPath,&valueArr)) {
            ROMEPrint::Error("\nWrong data base path : %s\n", xmlPath.Data());
            delete path;
            return false;
         }
         if (valueArr.GetEntriesFast()<=0) {
            ROMEPrint::Error("\nWrong data base path : %s\n",xmlPath.Data());
            delete path;
            return false;
         }
         values->SetAt(valueArr.At(0),0,0);
      }
   }
   delete path;
   return true;
}