/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
* Contributors are mentioned in the code where appropriate. *
* *
* Permission to use, copy, modify and distribute this software and its *
* documentation strictly for non-commercial purposes is hereby granted *
* without fee, provided that the above copyright notice appears in all *
* copies and that both the copyright notice and this permission notice *
* appear in the supporting documentation. The authors make no claims *
* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
/*
$Log$
Revision 1.1 2000/11/01 16:01:22 kowal2
Classes for handling the new hits structures
*/
///////////////////////////////////////////////////////////////////////////////
// //
// AliClassInfo //
// //
//Defined to make unified interface to primitive types (in Root described by //
// TDataType) and TClass. //
// Additional virtual function (comparing to ROOT TClass) neccesary //
// for AliContainers //
// virtual void CTORBuffer(void * pointer, UInt_t size=1) //
// should construct buffer of size =size objects at position pointer //
// virtual void DTORBuffer(void * pointer, UInt_t size=1) //
// should destruct buffer of size =size objects at position pointer //
// virtual void StreamBuffer(TBuffer& b, const void *object, UInt_t size) //
// stream buffer of objects `
//Begin_Html
//
//End_Html
// //
// //
///////////////////////////////////////////////////////////////////////////////
#include "AliClassInfo.h"
#include "TMath.h"
#include "TClass.h"
#include "TROOT.h"
#include "iostream.h"
#include "AliDataType.h"
ClassImp(AliClassInfo)
TList AliClassInfo::fgList; // list of loaded class
AliClassInfo * AliClassInfo::FindClassInfo(const char * name)
{
//
TIter next(&fgList);
TString sname(name);
AliClassInfo * info;
while ((info = (AliClassInfo *) next()))
if (info->GetName()==sname) return info;
return 0;
}
AliClassInfo * AliClassInfo::GenerClassInfo(const char * classname)
{
//
// Set class information fClassInfo according class name
//
char name[100];
AliClassInfo *info=0;
sprintf(name,"AliClassType%s",classname);
info = AliClassInfo::FindClassInfo(classname);
if (info) return info;
//
if ( (!info) && (gROOT->GetType(classname),kTRUE)){
//if data type information exist
// char line[100];
// sprintf(line,"(*((AliClassInfo**)%p))= new AliDataType(\"%s\");",
// &info,classname);
// sprintf(line,"new AliDataType(\"%s\");",
// classname);
//cout<ProcessLine(line);
new AliDataType(classname);
info = AliClassInfo::FindClassInfo(classname);
}
if (info) return info;
TClass * cl = gROOT->GetClass(classname);
// if exist root class information
if ( (!info) && (gROOT->GetClass(classname))){ //is it class?
char chinter[1000];
sprintf(chinter,"%s.C",classname);
GenerClassInfoCode(classname,kTRUE,cl->GetDeclFileName(),chinter);
info = AliClassInfo::FindClassInfo(classname);
}
if (!info){
TClass * cl = new TClass(classname,0);
if (cl->Size()>0){ //if root information doesn't exist
//but exist cint information
char chinclude[1000];
sprintf(chinclude,"%s.h",classname);
char chinter[1000];
sprintf(chinter,"%s.C",classname);
GenerClassInfoCode(classname,kTRUE,chinclude,chinter);
}
}
return info;
}
void AliClassInfo::GenerClassInfoCode(const char * clname, Bool_t load,
const char *incpath, const char *outfile)
{
// gener temporary file - name
FILE *fout = fopen(outfile,"w");
if (!clname){
cerr<<"Class not specified\n";
return ;
}
char buff[1000];
const char *pchar =incpath;
//replace with /0
char * pchar2 =buff;
fprintf(fout,"#include \"AliClassInfo.h\"\n");
if (incpath==0) {}
else{
// proces headers - header separated by
pchar =incpath;
pchar2 =buff;
//
while (*pchar==' ') pchar++;
while (*pchar) {
if (*pchar!=' ') *pchar2++ = *pchar;
else
if (*(pchar2-1)!=0) *pchar2++=0;
pchar++;
}
*pchar2=0;
Int_t index = pchar2-buff;
for (Int_t i=0;iRename("/tmp/root_tmpinterinter"
sprintf(line,".L %s+",outfile);
cout<ProcessLine(line);
cout<GetClass("AliLHit",kTRUE);
fprintf(fout,"\n/************************************************/\n");
fprintf(fout,"/* Automaticaly generated interface for class \n");
fprintf(fout," %s \n",clname);
fprintf(fout,"**************************************************/\n");
fprintf(fout,"\n\n");
//constructor
fprintf(fout,"class AliClass%s : public AliClassInfo {\n",clname);
fprintf(fout,"public:\n");
fprintf(fout,"\tAliClass%s(){\n",clname);
fprintf(fout,"\t SetName(\"%s\");\n",clname);
fprintf(fout,"\t SetTitle(\"Interface for %s class \");\n",clname);
fprintf(fout,"\t fgList.Add(this);\n");
fprintf(fout,"\t fSize = sizeof(%s);\n\t}\n",clname);
//
fprintf(fout,"\tconst char * GetClassName(){ return \"%s\";}\n",clname);
//
fprintf(fout,"\tvirtual TClass* GetClass(){return %s::Class();}\n",clname);
//placement constructor interface
fprintf(fout,"\tvoid CTORBuffer(void * pointer, UInt_t size=1)\n\t{\n");
fprintf(fout,"\t %s * last = &((%s*)pointer)[size];\n",clname,clname);
fprintf(fout,"\t %s * p = (%s*)pointer;\n",clname,clname);
fprintf(fout,"\t while (p!=last) new (p++)%s;\n\t}\n",clname);
//placement destructor interface
fprintf(fout,"\tvoid DTORBuffer(void * pointer, UInt_t size=1)\n\t{\n");
fprintf(fout,"\t %s * last = &((%s*)pointer)[size];\n",clname,clname);
fprintf(fout,"\t %s * p = (%s*)pointer;\n",clname,clname);
fprintf(fout,"\t while (p!=last) (p++)->~%s();\n\t}\n",clname);
//streamer interface
fprintf(fout,"\tvoid StreamBuffer(TBuffer &b,const void * pointer, UInt_t size=1)\n\t{\n");
fprintf(fout,"\t for (UInt_t i=0;iDump();}\n",clname);
fprintf(fout,"};\n");
//make instance of the class
fprintf(fout,"AliClass%s galiclass____%s; \n",clname,clname);
return kTRUE;
}