00001 #include <stdio.h>
00002 #include <assert.h>
00003 #include "TObject.h"
00004 #include "TNamed.h"
00005 #include "TObjArray.h"
00006 #include "TString.h"
00007 #include "StMkDeb.h"
00008
00009 int StMkDeb::fgCurr = -2003;
00010 int StMkDeb::fgStage = 0;
00011 TObjArray *StMkDeb::fgArr=0;
00012
00013
00014 int StMkDeb::Register (const TObject *mk)
00015 {
00016 if (!fgArr) fgArr = new TObjArray(100);
00017 fgArr->Add((TObject*)mk);
00018 return fgArr->GetLast();
00019 }
00020
00021
00022 int StMkDeb::Register (StMaker *mk)
00023 {
00024 int id = Register ((TObject*)mk);
00025 ((TObject*)mk)->TObject::SetUniqueID(id+1);
00026 return id;
00027 }
00028
00029
00030 void StMkDeb::Cancel(const TObject *mk)
00031 {
00032 if (!fgArr) return;
00033 if (!mk ) return;
00034 int i = fgArr->IndexOf(mk);
00035 fgArr->AddAt(0,i);
00036 }
00037
00038 void StMkDeb::Cancel(StMaker *mk)
00039 {
00040 if (!fgArr) return;
00041 if (!mk ) return;
00042 int id = int(((TObject*)mk)->TObject::GetUniqueID())-1;
00043 if (id<0) return;
00044 ((TObject*)mk)->TObject::SetUniqueID(0);
00045 TObject *to = fgArr->At(id);
00046 TObject *tmk= (TObject *) mk;
00047 if (to != tmk) delete to;
00048 fgArr->AddAt(0,id);
00049 }
00050
00051 int StMkDeb::SetCurrent(const TObject *mk, int kind)
00052 {
00053 if (fgCurr<-1) Ready();
00054 fgCurr = kind+100*(fgArr->IndexOf(mk));
00055 return fgCurr;
00056 }
00057
00058
00059 int StMkDeb::SetCurrent(const StMaker *mk, int kind)
00060 {
00061 if (fgCurr<-1) Ready();
00062 fgCurr = int(((TObject*)mk)->TObject::GetUniqueID())-1;
00063 assert(fgCurr>=0);
00064 fgCurr = fgCurr*100+kind;
00065 return fgCurr;
00066 }
00067
00068
00069 int StMkDeb::SetCurrent(int curr)
00070 {
00071 if (fgCurr<-1) Ready();
00072 if (curr>=0) fgCurr = curr;
00073 return fgCurr;
00074 }
00075
00076 void StMkDeb::SetStage(int stage)
00077 {
00078 fgStage = stage;
00079 }
00080
00081 void StMkDeb::Ready()
00082 {
00083 if (fgCurr>-2003) return;
00084 if (!fgArr) return;
00085 fgCurr=0;
00086 int lst = fgArr->GetLast();
00087 for (int i=0;i<=lst; i++) {
00088 TObject *to = fgArr->At(i);
00089 if (!to) continue;
00090 if (!to->TObject::TestBit(TObject::kNotDeleted)) {fgArr->AddAt(0,i); continue;}
00091 if (to->IsA() == TNamed::Class()) continue;
00092 TString ts(to->ClassName());
00093 ts += "::";
00094 ts += to->GetName();
00095 ts += "#";
00096 ts += i;
00097 TNamed *tn = new TNamed(ts.Data(),"");
00098 fgArr->AddAt(tn,i);
00099 }
00100 }
00101
00102 const char *StMkDeb::GetName(int id)
00103 {
00104 if (!fgArr) return 0;
00105 static TString ts;
00106 int lst = fgArr->GetLast();
00107 if (id < 0 ) return "";
00108 int stage = id%100; id/=100;
00109 int kind = id%100; id/=100;
00110 if (id > lst) return "";
00111 ts = fgArr->At(id)->GetName();
00112 ts += " kind=" ;ts += kind ;
00113 ts += " stage=";ts += stage;
00114 return ts.Data();
00115 }
00116
00117 int StMkDeb::SetUser(TObject *us)
00118 {
00119 if (!fgArr) return 0;
00120 us->TObject::SetUniqueID(fgCurr*100+fgStage+1);
00121 return fgCurr;
00122 }
00123
00124 const char *StMkDeb::GetUser(const TObject *us)
00125 {
00126 return GetName(us->TObject::GetUniqueID()-1);
00127 }
00128
00129 void StMkDeb::Pause(const char *tit)
00130 {
00131 if (tit && *tit) printf("Pause %s\n",tit);
00132 }
00133
00134 int StMkDeb::GetCurrent(){return fgCurr;}
00135
00136
00137
00138