12 #include "RConfigure.h"
32 const Int_t kIsClassTree = BIT(7);
33 const Int_t kUsedByData = BIT(11);
34 const Int_t kUsedByFunc = BIT(12);
35 const Int_t kUsedByCode = BIT(13);
36 const Int_t kUsedByClass = BIT(14);
37 const Int_t kUsingData = BIT(15);
38 const Int_t kUsingFunc = BIT(16);
39 const Int_t kUsingCode = BIT(17);
40 const Int_t kUsingClass = BIT(18);
41 const Int_t kUsedByCode1 = BIT(19);
42 const Int_t kIsaPointer = BIT(20);
43 const Int_t kIsBasic = BIT(21);
45 static Float_t gXsize, gYsize, gDx, gDy, gLabdx, gLabdy, gDxx, gCsize;
46 static Int_t *gNtsons, *gNsons;
178 TClassTree::TClassTree()
197 SetSourceDir(
".:src:" + TROOT::GetSourceDir());
203 TClassTree::TClassTree(
const char *name,
const char *classes)
204 :TNamed(name,classes)
223 SetSourceDir(
".:src:" + TROOT::GetSourceDir());
226 if (classes && strlen(classes)) {
235 TClassTree::~TClassTree()
237 for (Int_t i=0;i<fNclasses;i++) {
239 if (fLinks[i]) fLinks[i]->Delete();
259 void TClassTree::Draw(
const char *classes)
262 gROOT->MakeDefCanvas();
265 if (classes && strlen(classes)) fClasses = classes;
266 for (Int_t i=0;i<fNclasses;i++) {
276 Int_t TClassTree::FindClass(
const char *classname)
278 for (Int_t i=0;i<fNclasses;i++) {
279 if(!fCnames[i]->CompareTo(classname))
return i;
287 void TClassTree::FindClassesUsedBy(Int_t iclass)
289 fCstatus[iclass] = 1;
292 TList *los = fLinks[iclass];
294 while ((os = (TObjString*)next())) {
295 i = FindClass(os->GetName());
297 if (fCstatus[i])
continue;
298 Int_t udata = os->TestBit(kUsedByData);
299 Int_t ufunc = os->TestBit(kUsedByFunc);
300 Int_t ucode = os->TestBit(kUsedByCode);
301 Int_t uclass = os->TestBit(kUsedByClass);
302 if (udata || ufunc || ucode || uclass) {
311 void TClassTree::FindClassesUsing(Int_t iclass)
314 fCstatus[iclass] = 1;
317 TList *los = fLinks[iclass];
319 while ((os = (TObjString*)next())) {
320 i = FindClass(os->GetName());
322 if (fCstatus[i])
continue;
323 Int_t udata = os->TestBit(kUsingData);
324 Int_t ufunc = os->TestBit(kUsingFunc);
325 Int_t ucode = os->TestBit(kUsingCode);
326 Int_t uclass = os->TestBit(kUsingClass);
327 if (udata || ufunc || ucode || uclass) {
337 void TClassTree::FindClassPosition(
const char *classname, Float_t &x, Float_t &y)
339 TIter next(gPad->GetListOfPrimitives());
342 while((obj=next())) {
343 if (obj->InheritsFrom(TPaveClass::Class())) {
344 pave = (TPaveClass*)obj;
345 if (!strcmp(pave->GetLabel(),classname)) {
346 x = 0.5*(pave->GetX1() + pave->GetX2());
347 y = 0.5*(pave->GetY1() + pave->GetY2());
358 void TClassTree::Init()
360 if (fNclasses)
return;
364 fNclasses = gClassTable->Classes();
365 fCnames =
new TString*[fNclasses];
366 fCtitles =
new TString*[fNclasses];
367 fCstatus =
new Int_t[fNclasses];
368 fParents =
new Int_t[fNclasses];
369 fCparent =
new Int_t[fNclasses];
370 fNdata =
new Int_t[fNclasses];
371 fCpointer =
new TClass*[fNclasses];
372 fOptions =
new TString*[fNclasses];
373 fLinks =
new TList*[fNclasses];
374 fDerived =
new char*[fNclasses];
377 for (i=0;i<fNclasses;i++) {
378 fCnames[i] =
new TString(gClassTable->Next());
379 fCpointer[i] = TClass::GetClass(fCnames[i]->Data());
380 fCtitles[i] =
new TString(fCpointer[i]->GetTitle());
382 fOptions[i] =
new TString(
"ID");
383 fLinks[i] =
new TList();
384 fDerived[i] =
new char[fNclasses];
388 for (i=0;i<fNclasses;i++) {
389 TList *lm = fCpointer[i]->GetListOfDataMembers();
390 if (lm) fNdata[i] = lm->GetSize();
393 char *derived = fDerived[i];
394 for (j=0;j<fNclasses;j++) {
396 if (fCpointer[i]->InheritsFrom(fCpointer[j])) {
402 TList *lb = fCpointer[i]->GetListOfBases();
404 clbase = (TBaseClass*)lb->First();
405 if (clbase == 0)
continue;
406 cl = (TClass*)clbase->GetClassPointer();
407 for (j=0;j<fNclasses;j++) {
408 if(cl == fCpointer[j]) {
415 for (i=0;i<fNclasses;i++) {
423 void TClassTree::ls(Option_t *)
const
426 for (Int_t i=0;i<fNclasses;i++) {
427 snprintf(line,500,
"%s%s",fCnames[i]->Data(),
"...........................");
428 snprintf(&line[30],460,
"%s",fCtitles[i]->Data());
430 printf(
"%5d %s\n",i,line);
437 TObjString *TClassTree::Mark(
const char *classname, TList *los, Int_t abit)
440 TObjString *os = (TObjString*)los->FindObject(classname);
442 os =
new TObjString(classname);
452 void TClassTree::Paint(Option_t *)
456 TIter next(gPad->GetListOfPrimitives());
458 while((obj=next())) {
459 if (obj->TestBit(kIsClassTree))
delete obj;
463 Int_t nch = strlen(GetClasses());
464 if (nch == 0)
return;
465 char *classes =
new char[nch+1];
466 gNsons =
new Int_t[fNclasses];
467 gNtsons =
new Int_t[fNclasses];
468 strlcpy(classes,GetClasses(),nch+1);
471 char *ptr = strtok(classes,
":");
476 j = FindClass(&ptr[1]);
478 for (i=0;i<fNclasses;i++) {
479 derived = fDerived[i];
480 if(derived[j]) fCstatus[i] = 1;
483 }
else if (ptr[0] ==
'>') {
484 for (i=0;i<fNclasses;i++) {
485 if(fCnames[i]->Contains(&ptr[1])) {
491 }
else if (ptr[nch-1] ==
'<') {
493 for (i=0;i<fNclasses;i++) {
494 if(fCnames[i]->Contains(ptr)) {
495 FindClassesUsedBy(i);
501 }
else if (ptr[nch-1] ==
'*') {
503 for (i=0;i<fNclasses;i++) {
504 if(fCnames[i]->Contains(ptr)) fCstatus[i] = 1;
507 for (i=0;i<fNclasses;i++) {
508 if(!fCnames[i]->CompareTo(ptr)) {
509 FindClassesUsedBy(i);
518 for (i=0;i<fNclasses;i++) {
519 gNsons[i] = gNtsons[i] = 0;
521 for (i=0;i<fNclasses;i++) {
522 if (fCstatus[i] == 0)
continue;
523 derived = fDerived[i];
524 for (j=0;j<fNclasses;j++) {
525 if (j == i)
continue;
532 for (i=0;i<fNclasses;i++) {
533 if (fCstatus[i] == 0)
continue;
543 for (i=0;i<fNclasses;i++) {
544 if (fCstatus[i] == 0)
continue;
545 if (gNsons[i] != 0)
continue;
548 while (fCparent[icl] >= 0) {
550 if (nlevel > maxlev) maxlev = nlevel;
560 for (i=0;i<fNclasses;i++) {
561 if (fCstatus[i] == 0)
continue;
562 if (fCparent[i] < 0) {
563 ndiv += gNtsons[i]+1;
570 Float_t xmin = gPad->GetX1();
571 Float_t xmax = gPad->GetX2();
572 Float_t ymin = gPad->GetY1();
573 Float_t ymax = gPad->GetY2();
574 Float_t ytop = gYsize/20;
575 gXsize = xmax - xmin;
576 gYsize = ymax - ymin;
577 gDy = (gYsize-ytop)/(ndiv);
578 if (gDy > gYsize/10.) gDy = gYsize/10.;
580 if (maxlev > 5) gDx = 0.97*gXsize/maxlev;
581 Float_t y = ymax -ytop;
582 gLabdx = fLabelDx*gXsize;
583 if (gLabdx > 0.95*gDx) gLabdx = 0.95*gDx;
585 gDxx = 0.5*gXsize/26.;
586 Float_t xleft = xmin +gDxx;
587 Float_t ymore = 0.5*nmore*gDy+fYoffset*gYsize;
588 Int_t dxpixels = gPad->XtoAbsPixel(gLabdx) - gPad->XtoAbsPixel(0);
589 Int_t dypixels = gPad->YtoAbsPixel(0) - gPad->YtoAbsPixel(gLabdy);
590 gCsize = dxpixels/(10.*dypixels);
591 gCsize = std::max(gCsize,Float_t(0.75));
592 gCsize = std::min(gCsize,Float_t(1.1));
594 for (i=0;i<fNclasses;i++) {
595 if (fCstatus[i] == 0)
continue;
596 if (fCparent[i] < 0) {
597 y -= gDy+0.5*gNtsons[i]*gDy;
598 if (!fCnames[i]->CompareTo(
"TObject")) y += ymore;
599 PaintClass(i,xleft,y);
600 y -= 0.5*gNtsons[i]*gDy;
605 if (fShowCod) ShowCod();
606 if (fShowHas) ShowHas();
607 if (fShowMul) ShowMul();
608 if (fShowRef) ShowRef();
610 nch = strlen(GetClasses());
612 if (nch > 20) xmax = 0.5;
613 if (nch > 50) xmax = 0.7;
614 if (nch > 70) xmax = 0.9;
615 TPaveClass *ptitle =
new TPaveClass(xmin +0.1*gXsize/26.
616 ,ymin+gYsize-0.9*gYsize/20.
618 ,ymin+gYsize-0.1*gYsize/26.
620 ptitle->SetFillColor(42);
621 ptitle->SetBit(kIsClassTree);
633 void TClassTree::PaintClass(Int_t iclass, Float_t xleft, Float_t y)
635 Float_t u[2],yu=0,yl=0;
636 Int_t ns = gNsons[iclass];
639 if(ns != 0) u[1] = u[0]+gDx;
640 TLine *line =
new TLine(u[0],y,u[1],y);
641 line->SetBit(kIsClassTree);
643 Int_t icobject = FindClass(
"TObject");
644 TPaveClass *label =
new TPaveClass(xleft+gDxx,y-gLabdy,xleft+gLabdx,y+gLabdy,fCnames[iclass]->Data(),
this);
645 char *derived = fDerived[iclass];
646 if (icobject >= 0 && !derived[icobject]) label->SetFillColor(30);
647 if (fCstatus[iclass] > 1) label->SetFillColor(kYellow);
648 label->SetTextSize(gCsize);
649 label->SetBit(kIsClassTree);
650 label->SetToolTipText(fCtitles[iclass]->Data(),500);
655 y += 0.5*gNtsons[iclass]*gDy;
657 for (Int_t i=0;i<fNclasses;i++) {
658 if(fCparent[i] != iclass)
continue;
659 if (gNtsons[i] > 1) y -= 0.5*gNtsons[i]*gDy;
661 if (!first) {first=1; yu = y;}
662 PaintClass(i,u[1],y);
664 if (gNtsons[i] > 1) y -= 0.5*gNtsons[i]*gDy;
668 line =
new TLine(u[1],yl,u[1],yu);
669 line->SetBit(kIsClassTree);
681 void TClassTree::SaveAs(
const char *filename, Option_t *option)
const
683 if (gDirectory) gDirectory->SaveObjectAs(
this,filename,option);
690 void TClassTree::ScanClasses(Int_t iclass)
693 TList *los = fLinks[iclass];
699 TClass *cl = fCpointer[iclass];
701 TList *lm = cl->GetListOfDataMembers();
705 while ((dm = (TDataMember *) next())) {
707 ic = FindClass(dm->GetTypeName());
708 if (ic < 0 || ic == iclass)
continue;
710 os = Mark(fCnames[ic]->Data(),los,kUsedByData);
712 os->SetBit(kIsaPointer,dm->IsaPointer());
713 os->SetBit(kIsBasic,dm->IsBasic());
714 os->SetUniqueID(imember);
716 Mark(fCnames[iclass]->Data(),losref,kUsingData);
722 char *derived = fDerived[iclass];
725 TList *lb = fCpointer[iclass]->GetListOfBases();
728 while ((clbase = (TBaseClass*)nextb())) {
730 if (numb == 1)
continue;
731 ic = FindClass(clbase->GetName());
734 for (ic=0;ic<fNclasses;ic++) {
735 if (ic == iclass)
continue;
738 Mark(fCnames[ic]->Data(),los,kUsedByClass);
739 Mark(fCnames[iclass]->Data(),losref,kUsingClass);
748 TMethodArg *methodarg;
749 TList *lf = cl->GetListOfMethods();
753 while ((method = (TMethod*) nextm())) {
755 name = method->GetReturnTypeName();
756 star = strstr((
char*)name.Data(),
"*");
758 cref = strstr((
char*)name.Data(),
"&");
760 ic = FindClass(name);
761 if (ic < 0 || ic == iclass)
continue;
763 Mark(fCnames[ic]->Data(),los,kUsedByFunc);
764 Mark(fCnames[iclass]->Data(),losref,kUsingFunc);
768 TIter nexta(method->GetListOfMethodArgs());
769 while ((methodarg = (TMethodArg*) nexta())) {
770 name = methodarg->GetTypeName();
771 star = strstr((
char*)name.Data(),
"*");
773 cref = strstr((
char*)name.Data(),
"&");
775 ic = FindClass(name);
776 if (ic < 0 || ic == iclass)
continue;
778 Mark(fCnames[ic]->Data(),los,kUsedByFunc);
779 Mark(fCnames[iclass]->Data(),losref,kUsingFunc);
789 if (!cl->GetImplFileName() || !cl->GetImplFileName()[0])
792 const char *source = gSystem->BaseName( gSystem->UnixPathName(cl->GetImplFileName()));
793 char *sourceName = gSystem->Which( fSourceDir.Data(), source , kReadPermission );
794 if (!sourceName)
return;
795 Int_t ncn = strlen(fCnames[iclass]->Data())+2;
796 char *cname =
new char[ncn+1];
797 snprintf(cname,ncn,
"%s::",fCnames[iclass]->Data());
799 std::ifstream sourceFile;
800 sourceFile.open( sourceName, std::ios::in );
802 if( sourceFile.good() ) {
803 const Int_t kMAXLEN=1500;
805 while( !sourceFile.eof() ) {
806 sourceFile.getline( line, kMAXLEN-1 );
807 if( sourceFile.eof() )
break;
808 Int_t nblank = strspn(line,
" ");
809 if (!strncmp(&line[nblank],
"//",2))
continue;
810 char *cc = strstr(line,
"::");
813 if (!strncmp(&line[nblank],cname,ncn))
break;
814 Int_t nl = strlen(&line[nblank]);
815 if (!strncmp(&line[nblank],cc+2,nl))
break;
817 nlines++;
if (nlines > 1000)
break;
818 char *inc = strstr(line,
"#include");
820 char *ch = strstr(line,
".h");
823 char *start = strstr(line,
"<");
824 if (!start) start = strstr(line,
"\"");
825 if (!start)
continue;
827 while ((start < ch) && (*start ==
' ')) start++;
828 icl = FindClass(start);
829 if (icl < 0 || icl == iclass)
continue;
831 losref = fLinks[icl];
832 Mark(fCnames[icl]->Data(),los,kUsedByCode1);
833 Mark(fCnames[icl]->Data(),los,kUsedByCode);
834 Mark(fCnames[iclass]->Data(),losref,kUsingCode);
836 derived = fDerived[icl];
837 for (ic=0;ic<fNclasses;ic++) {
838 if (ic == icl)
continue;
841 Mark(fCnames[ic]->Data(),los,kUsedByCode);
842 Mark(fCnames[iclass]->Data(),losref,kUsingCode);
856 void TClassTree::SetClasses(
const char *classes, Option_t *)
858 if (classes == 0)
return;
860 for (Int_t i=0;i<fNclasses;i++) {
870 void TClassTree::SetLabelDx(Float_t labeldx)
881 void TClassTree::SetYoffset(Float_t offset)
890 void TClassTree::ShowClassesUsedBy(
const char *classes)
893 Int_t nch = strlen(classes);
894 char *ptr =
new char[nch+1];
895 strlcpy(ptr,classes,nch+1);
897 i = FindClass(&ptr[1]);
899 char *derived = fDerived[i];
900 for (j=0;j<fNclasses;j++) {
901 if(derived[j]) FindClassesUsedBy(j);
904 }
else if (ptr[nch-1] ==
'*') {
906 for (j=0;j<fNclasses;j++) {
907 if(fCnames[j]->Contains(ptr)) FindClassesUsedBy(j);
910 for (j=0;j<fNclasses;j++) {
911 if(!fCnames[j]->CompareTo(ptr)) FindClassesUsedBy(j);
921 void TClassTree::ShowClassesUsing(
const char *classes)
924 Int_t nch = strlen(classes);
925 char *ptr =
new char[nch+1];
926 strlcpy(ptr,classes,nch+1);
928 i = FindClass(&ptr[1]);
930 char *derived = fDerived[i];
931 for (j=0;j<fNclasses;j++) {
932 if(derived[j]) FindClassesUsing(j);
935 }
else if (ptr[nch-1] ==
'*') {
937 for (j=0;j<fNclasses;j++) {
938 if(fCnames[j]->Contains(ptr)) FindClassesUsing(j);
941 for (j=0;j<fNclasses;j++) {
942 if(!fCnames[j]->CompareTo(ptr)) FindClassesUsing(j);
952 void TClassTree::ShowCod()
954 TIter next(gPad->GetListOfPrimitives());
961 while((obj=next())) {
962 if (obj->InheritsFrom(TPaveClass::Class())) {
963 pave = (TPaveClass*)obj;
964 icl = FindClass(pave->GetLabel());
965 if (icl < 0)
continue;
966 char *derived = fDerived[icl];
967 x = 0.5*(pave->GetX1() + pave->GetX2());
968 y = 0.5*(pave->GetY1() + pave->GetY2());
969 TIter nextos(fLinks[icl]);
971 while((os=(TObjString*)nextos())) {
972 if (!os->TestBit(kUsedByCode1))
continue;
973 ic = FindClass(os->GetName());
974 if (derived[ic])
continue;
975 FindClassPosition(os->GetName(),x1,y1);
976 if (x1 == 0 || y1 == 0)
continue;
977 TArrow *arrow =
new TArrow(x,y,x1,y1,0.008,
"|>");
978 arrow->SetLineColor(kGreen);
979 arrow->SetFillColor(kGreen);
980 arrow->SetBit(kIsClassTree);
990 void TClassTree::ShowHas()
992 TIter next(gPad->GetListOfPrimitives());
999 while((obj=next())) {
1000 if (obj->InheritsFrom(TPaveClass::Class())) {
1001 pave = (TPaveClass*)obj;
1002 icl = FindClass(pave->GetLabel());
1003 if (icl < 0)
continue;
1004 y = 0.5*(pave->GetY1() + pave->GetY2());
1005 Int_t nmembers = fNdata[icl];
1006 if (nmembers == 0)
continue;
1007 dx = (pave->GetX2() - pave->GetX1())/nmembers;
1008 TIter nextos(fLinks[icl]);
1010 while((os=(TObjString*)nextos())) {
1011 if (!os->TestBit(kUsedByData))
continue;
1012 if (os->TestBit(kIsaPointer))
continue;
1013 if (os->TestBit(kIsBasic))
continue;
1014 FindClassPosition(os->GetName(),x1,y1);
1015 if (x1 == 0 || y1 == 0)
continue;
1016 Int_t imember = os->GetUniqueID();
1017 TLine *line =
new TLine(pave->GetX1()+(imember+0.5)*dx,y,x1,y1);
1018 line->SetLineStyle(3);
1019 line->SetLineColor(6);
1020 line->SetBit(kIsClassTree);
1035 void TClassTree::ShowLinks(Option_t *option)
1037 TString opt = option;
1039 fShowCod = fShowHas = fShowMul = fShowRef = 0;
1040 if (opt.Contains(
"C")) fShowCod = 1;
1041 if (opt.Contains(
"H")) fShowHas = 1;
1042 if (opt.Contains(
"M")) fShowMul = 1;
1043 if (opt.Contains(
"R")) fShowRef = 1;
1050 void TClassTree::ShowMul()
1052 TIter next(gPad->GetListOfPrimitives());
1059 while((obj=next())) {
1060 if (obj->InheritsFrom(TPaveClass::Class())) {
1061 pave = (TPaveClass*)obj;
1062 icl = FindClass(pave->GetLabel());
1063 if (icl < 0)
continue;
1064 char *derived = fDerived[icl];
1065 x = 0.5*(pave->GetX1() + pave->GetX2());
1066 y = 0.5*(pave->GetY1() + pave->GetY2());
1067 TIter nextos(fLinks[icl]);
1069 while((os=(TObjString*)nextos())) {
1070 if (!os->TestBit(kUsedByClass))
continue;
1071 ic = FindClass(os->GetName());
1072 if (derived[ic] != 2)
continue;
1073 FindClassPosition(os->GetName(),x1,y1);
1074 if (x1 == 0 || y1 == 0)
continue;
1075 TLine *line =
new TLine(x,y,x1,y1);
1076 line->SetBit(kIsClassTree);
1077 line->SetLineStyle(2);
1078 line->SetLineColor(kBlue);
1088 void TClassTree::ShowRef()
1090 TIter next(gPad->GetListOfPrimitives());
1096 Int_t icc = FindClass(
"TClass");
1098 while((obj=next())) {
1099 if (obj->InheritsFrom(TPaveClass::Class())) {
1100 pave = (TPaveClass*)obj;
1101 icl = FindClass(pave->GetLabel());
1102 if (icl < 0)
continue;
1103 y = 0.5*(pave->GetY1() + pave->GetY2());
1104 Int_t nmembers = fNdata[icl];
1105 if (nmembers == 0)
continue;
1106 dx = (pave->GetX2() - pave->GetX1())/nmembers;
1107 TIter nextos(fLinks[icl]);
1109 while((os=(TObjString*)nextos())) {
1110 if (!os->TestBit(kUsedByData))
continue;
1111 ic = FindClass(os->GetName());
1112 if (!os->TestBit(kIsaPointer))
continue;
1113 if (os->TestBit(kIsBasic))
continue;
1114 if (ic == icc)
continue;
1115 FindClassPosition(os->GetName(),x1,y1);
1116 if (x1 == 0 || y1 == 0)
continue;
1117 Int_t imember = os->GetUniqueID();
1118 TArrow *arrow =
new TArrow(pave->GetX1()+(imember+0.5)*dx,y,x1,y1,0.008,
"|>");
1119 arrow->SetLineColor(kRed);
1120 arrow->SetFillColor(kRed);
1121 arrow->SetBit(kIsClassTree);
1132 void TClassTree::Streamer(TBuffer &R__b)
1135 if (R__b.IsReading()) {
1136 Version_t R__v = R__b.ReadVersion();
if (R__v) { }
1137 TNamed::Streamer(R__b);
1138 fClasses.Streamer(R__b);
1146 fCnames =
new TString*[fNclasses];
1147 fCtitles =
new TString*[fNclasses];
1148 fCstatus =
new Int_t[fNclasses];
1149 fParents =
new Int_t[fNclasses];
1150 fCparent =
new Int_t[fNclasses];
1151 fNdata =
new Int_t[fNclasses];
1152 fCpointer =
new TClass*[fNclasses];
1153 fOptions =
new TString*[fNclasses];
1154 fLinks =
new TList*[fNclasses];
1155 fDerived =
new char*[fNclasses];
1156 for (i=0;i<fNclasses;i++) {
1157 R__b >> fCstatus[i];
1158 R__b >> fParents[i];
1160 fCnames[i] =
new TString();
1161 fCtitles[i] =
new TString();
1162 fOptions[i] =
new TString();
1163 fCnames[i]->Streamer(R__b);
1164 fCtitles[i]->Streamer(R__b);
1165 fOptions[i]->Streamer(R__b);
1166 fLinks[i] =
new TList();
1167 fLinks[i]->Streamer(R__b);
1168 fDerived[i] =
new char[fNclasses];
1169 R__b.ReadFastArray(fDerived[i],fNclasses);
1171 fSourceDir.Streamer(R__b);
1173 R__b.WriteVersion(TClassTree::IsA());
1174 TNamed::Streamer(R__b);
1175 fClasses.Streamer(R__b);
1183 for (i=0;i<fNclasses;i++) {
1184 R__b << fCstatus[i];
1185 R__b << fParents[i];
1187 fCnames[i]->Streamer(R__b);
1188 fCtitles[i]->Streamer(R__b);
1189 fOptions[i]->Streamer(R__b);
1190 fLinks[i]->Streamer(R__b);
1191 R__b.WriteFastArray(fDerived[i],fNclasses);
1193 fSourceDir.Streamer(R__b);