ROOT logo
// @(#)root/base:$Id$
// Author: Victor Perev   04/10/2003
//         Philippe Canal 05/2004

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "TClassEdit.h"
#include <ctype.h>
#include "Rstrstream.h"
#include <set>

// CINT's API.
#include "Api.h"

namespace std {} using namespace std;

//______________________________________________________________________________
TClassEdit::TSplitType::TSplitType(const char *type2split, EModType mode) : fName(type2split), fNestedLocation(0)
{
   // default constructor
   TClassEdit::GetSplit(type2split, fElements, fNestedLocation, mode);
}

//______________________________________________________________________________
int TClassEdit::TSplitType::IsSTLCont(int testAlloc) const
{
   //  type     : type name: vector<list<classA,allocator>,allocator>
   //  testAlloc: if true, we test allocator, if it is not default result is negative
   //  result:    0          : not stl container
   //             abs(result): code of container 1=vector,2=list,3=deque,4=map
   //                           5=multimap,6=set,7=multiset
   //             positive val: we have a vector or list with default allocator to any depth
   //                   like vector<list<vector<int>>>
   //             negative val: STL container other than vector or list, or non default allocator
   //                           For example: vector<deque<int>> has answer -1

   
   if (fElements[0].empty()) return 0;
   int numb = fElements.size();
   if (!fElements[numb-1].empty() && fElements[numb-1][0]=='*') --numb;
   
   if ( fNestedLocation ) {
      // The type has been defined inside another namespace and/or class
      // this couldn't possibly be an STL container
      return 0;
   }
   
   int kind = STLKind(fElements[0].c_str());
   
   if (kind==kVector || kind==kList ) {
      
      int nargs = STLArgs(kind);
      if (testAlloc && (numb-1 > nargs) && !IsDefAlloc(fElements[numb-1].c_str(),fElements[1].c_str())) {
         
         // We have a non default allocator,
         // let's return a negative value.
         
         kind = -kind;
         
      } else {
         
         // We has a default allocator, let's continue to
         // look inside the argument list.
         int k = TClassEdit::IsSTLCont(fElements[1].c_str(),testAlloc);
         if (k<0) kind = -kind;
         
      }
   }
   
   // We return a negative value for anything which is not a vector or a list.
   if(kind>2) kind = - kind;
   return kind;
}

//______________________________________________________________________________
void TClassEdit::TSplitType::ShortType(std::string &answ, int mode)
{
   /////////////////////////////////////////////////////////////////////////////
   // Return the absolute type of typeDesc into the string answ.
   
   // E.g.: typeDesc = "class const volatile TNamed**", returns "TNamed**".
   // if (mode&1) remove last "*"s                     returns "TNamed"
   // if (mode&2) remove default allocators from STL containers
   // if (mode&4) remove all     allocators from STL containers
   // if (mode&8) return inner class of stl container. list<innerClass>
   // if (mode&16) return deapest class of stl container. vector<list<deapest>>
   // if (mode&kDropAllDefault) remove default template arguments
   /////////////////////////////////////////////////////////////////////////////

   answ.clear();
   int narg = fElements.size();
   int tailLoc = 0;

   if (narg == 0) {
      answ = fName;
      return ;
   }
   //      fprintf(stderr,"calling ShortType %d for %s with narg %d\n",mode,typeDesc,narg);
   //      {for (int i=0;i<narg;i++) fprintf(stderr,"calling ShortType %d for %s with %d %s \n",
   //                                        mode,typeDesc,i,arglist[i].c_str());
   //      }
   if (fElements[narg-1].empty() == false && fElements[narg-1][0]=='*') {
      if ((mode&1)==0) tailLoc = narg-1;
      narg--;
   }
   mode &= (~1);
   
   if (fNestedLocation) narg--;
   
   //    fprintf(stderr,"calling ShortType %d for %s with narg %d tail %d\n",imode,typeDesc,narg,tailLoc);
   
   //kind of stl container
   int kind = STLKind(fElements[0].c_str());
   int iall = STLArgs(kind);
   
   // Only class is needed
   if (mode&(8|16)) {
      while(narg-1>iall) { fElements.pop_back(); narg--;}
      if (!fElements[0].empty() && tailLoc) {
         tailLoc = 0;
      }
      fElements[0].clear();
      mode&=(~8);
   }
   
   if (mode & kDropStlDefault) mode |= kDropDefaultAlloc;
   
   if (kind) {
      bool allocRemoved = false;
      
      if ( mode & (kDropDefaultAlloc|kDropAlloc) ) {
         // remove allocators
         
         
         if (narg-1 == iall+1) {
            // has an allocator specified
            bool dropAlloc = false;
            if (mode & kDropAlloc) {
               
               dropAlloc = true;
               
            } else if (mode & kDropDefaultAlloc) {
               switch (kind) {
                  case kVector:
                  case kList:
                  case kDeque:
                  case kSet:
                  case kMultiSet:
                     dropAlloc = IsDefAlloc(fElements[iall+1].c_str(),fElements[1].c_str());
                     break;
                  case kMap:
                  case kMultiMap:
                     dropAlloc = IsDefAlloc(fElements[iall+1].c_str(),fElements[1].c_str(),fElements[2].c_str());
                     break;
                  default:
                     dropAlloc = false;
               }
               
            }
            if (dropAlloc) {
               narg--;
               allocRemoved = true;
            }
         } else {
            // has no allocator specified (hence it is already removed!)
            allocRemoved = true;
         }
      }
      
      if ( allocRemoved && (mode & kDropStlDefault) && narg-1 == iall) { // remove default comparator
         if ( IsDefComp( fElements[iall].c_str(), fElements[1].c_str() ) ) {
            narg--;
         }
      } else if ( mode & kDropComparator ) {
         
         switch (kind) {
            case kVector:
            case kList:
            case kDeque:
               break;
            case kSet:
            case kMultiSet:
            case kMap:
            case kMultiMap:
               if (!allocRemoved && narg-1 == iall+1) {
                  narg--;
                  allocRemoved = true;
               }
               if (narg-1 == iall) narg--;
               break;
            default:
               break;
         }
      }
   }
   
   //   do the same for all inside
   for (int i=1;i<narg; i++) {
      if (strchr(fElements[i].c_str(),'<')==0) {
         if (mode&kDropStd && strncmp( fElements[i].c_str(), "std::", 5) == 0) {
            fElements[i].erase(0,5);
         }         
         continue;
      }
      bool hasconst = 0==strncmp("const ",fElements[i].c_str(),6);
      //NOTE: Should we also check the end of the type for 'const'?
      fElements[i] = TClassEdit::ShortType(fElements[i].c_str(),mode);
      if (hasconst) {
         fElements[i] = "const " + fElements[i];
      }
   }
   
   if (!fElements[0].empty()) {answ += fElements[0]; answ +="<";}
   
   if (mode & kDropAllDefault) {
      int nargNonDefault = 0;
      std::string nonDefName = answ;
      // "superlong" because tLong might turn fName into an even longer name
      std::string nameSuperLong = fName;
      G__TypedefInfo td;
      td.Init(nameSuperLong.c_str());
      if (td.IsValid())
         nameSuperLong = td.TrueName();
      while (++nargNonDefault < narg) {
         // If T<a> is a "typedef" (aka default template params)
         // to T<a,b> then we can strip the "b".
         const char* closeTemplate = " >";
         if (nonDefName[nonDefName.length() - 1] != '>')
            ++closeTemplate;
         td.Init((nonDefName + closeTemplate).c_str());
         if (td.IsValid() && nameSuperLong == td.TrueName())
            break;
         if (nargNonDefault>1) nonDefName += ",";
         nonDefName += fElements[nargNonDefault];
      }
      if (nargNonDefault < narg)
         narg = nargNonDefault;
   }
   
   
   { for (int i=1;i<narg-1; i++) { answ += fElements[i]; answ+=",";} }
   if (narg>1) { answ += fElements[narg-1]; }
   
   if (!fElements[0].empty()) {
      if ( answ.at(answ.size()-1) == '>') {
         answ += " >";
      } else {
         answ += '>';
      }
   }
   if (fNestedLocation) answ += fElements[fNestedLocation];
   if (tailLoc) answ += fElements[tailLoc];
   
}   
   


//______________________________________________________________________________
int   TClassEdit::STLKind(const char *type)
{
//      Converts STL container name to number. vector -> 1, etc..

   unsigned char offset = 0;
   if (strncmp(type,"std::",5)==0) { offset = 5; }

   static const char *stls[] =                  //container names
   {"any","vector","list","deque","map","multimap","set","multiset","bitset",0};

//              kind of stl container
   for(int k=1;stls[k];k++) {if (strcmp(type+offset,stls[k])==0) return k;}
   return 0;
}

//______________________________________________________________________________
int   TClassEdit::STLArgs(int kind)
{
//      Return number of arguments for STL container before allocator

   static const char  stln[] =// min number of container arguments
      //     vector, list, deque, map, multimap, set, multiset, bitset 
      {    1,     1,    1,     1,   3,        3,   2,        2,      1 };

   return stln[kind];
}

//______________________________________________________________________________
bool TClassEdit::IsDefAlloc(const char *allocname, const char *classname)
{
   // return whether or not 'allocname' is the STL default allocator for type
   // 'classname'

   string a = allocname;
   if (strncmp(a.c_str(),"std::",5)==0) {
      a.erase(0,5);
   }
   string k = classname;
   if (a=="alloc")                              return true;
   if (a=="__default_alloc_template<true,0>")   return true;
   if (a=="__malloc_alloc_template<0>")         return true;

   string ts("allocator<"); ts += k; ts+=">";
   if (a==ts) return true;

   ts = "allocator<"; ts += k; ts+=" >";
   if (a==ts) return true;

   return false;
}

//______________________________________________________________________________
bool TClassEdit::IsDefAlloc(const char *allocname,
                            const char *keyclassname,
                            const char *valueclassname)
{
   // return whether or not 'allocname' is the STL default allocator for a key
   // of type 'keyclassname' and a value of type 'valueclassname'

   if (IsDefAlloc(allocname,keyclassname)) return true;


   string a = allocname;
   if (strncmp(a.c_str(),"std::",5)==0) {
      a.erase(0,5);
   }
   string k = keyclassname;
   string v = valueclassname;

   string stem("allocator<pair<");
   stem += k;
   stem += ",";
   stem += v;

   string ts(stem);
   ts += "> >";

   if (a==ts) return true;

   ts = stem;
   ts += " > >";

   if (a==ts) return true;

   stem = "allocator<pair<const ";
   stem += k;
   stem += ",";
   stem += v;

   ts = stem;
   ts += "> >";

   if (a==ts) return true;

   ts = stem;
   ts += " > >";

   if (a==ts) return true;

   if ( keyclassname[strlen(keyclassname)-1] == '*' ) {

      stem = "allocator<pair<";
      stem += k;
      stem += "const";
      stem += ",";
      stem += v;

      string tss(stem);
      tss += "> >";

      if (a==tss) return true;

      tss = stem;
      tss += " > >";

      if (a==tss) return true;

      stem = "allocator<pair<const ";
      stem += k;
      stem += "const";
      stem += ",";
      stem += v;

      tss = stem;
      tss += "> >";

      if (a==tss) return true;

      tss = stem;
      tss += " > >";

      if (a==tss) return true;

   }

   return false;
}

//______________________________________________________________________________
bool TClassEdit::IsDefComp(const char *compname, const char *classname)
{
   // return whether or not 'compare' is the STL default comparator for type
   // 'classname'

   string c = compname;
   string k = classname;

   // The default compartor is std::less<classname> which is usually stored
   // in CINT as less<classname>

   string stdless("less<");
   stdless += k;
   if (stdless[stdless.size()-1]=='>') stdless += " >";
   else stdless += ">";

   if (stdless == c) return true;

   stdless.insert(0,"std::");
   if (stdless == c) return true;

   return false;
}

//______________________________________________________________________________
string TClassEdit::GetLong64_Name(const char* original)
{
   // Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'

   if (original==0)
      return "";
   else 
      return GetLong64_Name(string(original));
}

//______________________________________________________________________________
string TClassEdit::GetLong64_Name(const string& original)
{
   // Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'

   static const char* longlong_s  = "long long";
   static const char* ulonglong_s = "unsigned long long";
   static const unsigned int longlong_len  = strlen(longlong_s);
   static const unsigned int ulonglong_len = strlen(ulonglong_s);

   string result = original;

   int pos = 0;
   while( (pos = result.find(ulonglong_s,pos) ) >=0 ) {
      result.replace(pos, ulonglong_len, "ULong64_t");
   }
   pos = 0;
   while( (pos = result.find(longlong_s,pos) ) >=0 ) {
      result.replace(pos, longlong_len, "Long64_t");
   }
   return result;
}

//______________________________________________________________________________
int TClassEdit::GetSplit(const char *type, vector<string>& output, int &nestedLoc, EModType mode)
{
   ///////////////////////////////////////////////////////////////////////////
   //  Stores in output (after emptying it) the splited type.
   //  Stores the location of the tail (nested names) in nestedLoc (0 indicates no tail).
   //  Return the number of elements stored.
   //
   //  First in list is the template name or is empty
   //         "vector<list<int>,alloc>**" to "vector" "list<int>" "alloc" "**"
   //   or    "TNamed*" to "" "TNamed" "*"
   ///////////////////////////////////////////////////////////////////////////

   nestedLoc = 0;
   output.clear();
   if (strlen(type)==0) return 0;
  
   string full( mode & kLong64 ? TClassEdit::GetLong64_Name( CleanType(type, 1 /* keepInnerConst */) )
               : CleanType(type, 1 /* keepInnerConst */) );
   if ( mode & kDropStd && strncmp( full.c_str(), "std::", 5) == 0) {
      full.erase(0,5);
   }
   const char *t = full.c_str();
   const char *c = strchr(t,'<');

   string stars;
   const unsigned int tlen( full.size() );
   if ( tlen > 0 ) {
      const char *starloc = t + tlen - 1;
      if ( (*starloc)=='*' ) {
         while( (*(starloc-1))=='*' ) { starloc--; }
         stars = starloc;
         const unsigned int starlen = strlen(starloc);
         full.erase(tlen-starlen,starlen);
      }
   }

   if (c) {
      //we have 'something<'
      output.push_back(string(full,0,c-t));

      const char *cursor;
      int level = 0;
      for(cursor = c + 1; *cursor != '\0' && !(level==0 && *cursor == '>'); ++cursor) {
         switch (*cursor) {
            case '<': ++level; break;
            case '>': --level; break; 
            case ',': 
               if (level == 0) {
                  output.push_back(std::string(c+1,cursor));
                  c = cursor;
               }
               break;
         }
      }
      if (*cursor=='>') {
         if (*(cursor-1) == ' ') {
            output.push_back(std::string(c+1,cursor-1));
         } else {
            output.push_back(std::string(c+1,cursor));            
         }
         // See what's next!
         if (*(cursor+1)==':') {
            // we have a name specified inside the class/namespace
            // For now we keep it in one piece
            nestedLoc = output.size();
            output.push_back((cursor+1));
         }
      } else if (level >= 0) {
         // Unterminated template
         output.push_back(std::string(c+1,cursor));
      }
   } else {
      //empty
      output.push_back(string());
      output.push_back(full);
   }

   if (stars.length()) output.push_back(stars);
   return output.size();
}


//______________________________________________________________________________
string TClassEdit::CleanType(const char *typeDesc, int mode, const char **tail)
{
   ///////////////////////////////////////////////////////////////////////////
   //      Cleanup type description, redundant blanks removed
   //      and redundant tail ignored
   //      return *tail = pointer to last used character
   //      if (mode==0) keep keywords
   //      if (mode==1) remove keywords outside the template params
   //      if (mode>=2) remove the keywords everywhere.
   //      if (tail!=0) cut before the trailing *
   //
   //      The keywords currently are: "const" , "volatile" removed
   //
   //
   //      CleanType(" A<B, C< D, E> > *,F,G>") returns "A<B,C<D,E> >*"
   ///////////////////////////////////////////////////////////////////////////

   static const char* remove[] = {"class","const","volatile",0};
   static bool isinit = false;
   static std::vector<size_t> lengths;
   if (!isinit) {
      for (int k=0; remove[k]; ++k) {
         lengths.push_back(strlen(remove[k]));
      }
      isinit = true;
   }

   string result;
   result.reserve(strlen(typeDesc)*2);
   int lev=0,kbl=1;
   const char* c;

   for(c=typeDesc;*c;c++) {
      if (c[0]==' ') {
         if (kbl)       continue;
         if (!isalnum(c[ 1]) && c[ 1] !='_')    continue;
      }
      if (kbl && (mode>=2 || lev==0)) { //remove "const' etc...
         int done = 0;
         int n = (mode) ? 999 : 1;

         // loop on all the keywords we want to remove
         for (int k=0; k<n && remove[k]; k++) {
            int rlen = lengths[k];

            // Do we have a match
            if (strncmp(remove[k],c,rlen)) continue;

            // make sure that the 'keyword' is not part of a longer indentifier
            if (isalnum(c[rlen]) || c[rlen]=='_' ||  c[rlen]=='$') continue;

            c+=rlen-1; done = 1; break;
         }
         if (done) continue;
      }

      kbl = (!isalnum(c[ 0]) && c[ 0]!='_' && c[ 0]!='$' && c[0]!='[' && c[0]!=']' && c[0]!='-' && c[0]!='@');
      // '@' is special character used only the artifical class name used by ROOT to implement the
      // I/O customization rules that requires caching of the input data.
      
      if (*c == '<')   lev++;
      if (lev==0 && !isalnum(*c)) {
         if (!strchr("*:_$ []-@",*c)) break;
      }
      if (c[0]=='>' && result.size() && result[result.size()-1]=='>') result+=" ";

      result += c[0];

      if (*c == '>')    lev--;
   }
   if(tail) *tail=c;
   return result;
}

//______________________________________________________________________________
string TClassEdit::ShortType(const char *typeDesc, int mode)
{
   /////////////////////////////////////////////////////////////////////////////
   // Return the absolute type of typeDesc.
   // E.g.: typeDesc = "class const volatile TNamed**", returns "TNamed**".
   // if (mode&1) remove last "*"s                     returns "TNamed"
   // if (mode&2) remove default allocators from STL containers
   // if (mode&4) remove all     allocators from STL containers
   // if (mode&8) return inner class of stl container. list<innerClass>
   // if (mode&16) return deapest class of stl container. vector<list<deapest>>
   // if (mode&kDropAllDefault) remove default template arguments
   /////////////////////////////////////////////////////////////////////////////

   string answer;

   // get list of all arguments
   if (typeDesc) {
      TSplitType arglist(typeDesc, (EModType) mode);
      arglist.ShortType(answer, mode);
   }

   return answer;
}

//______________________________________________________________________________
bool TClassEdit::IsSTLBitset(const char *classname)
{
   // Return true is the name is std::bitset<number> or bitset<number>

   if ( strncmp(classname,"bitset<",strlen("bitset<"))==0) return true;
   if ( strncmp(classname,"std::bitset<",strlen("std::bitset<"))==0) return true;
   return false;
}

//______________________________________________________________________________
int TClassEdit::IsSTLCont(const char *type,int testAlloc)
{
   //  type     : type name: vector<list<classA,allocator>,allocator>
   //  testAlloc: if true, we test allocator, if it is not default result is negative
   //  result:    0          : not stl container
   //             abs(result): code of container 1=vector,2=list,3=deque,4=map
   //                           5=multimap,6=set,7=multiset
   //             positive val: we have a vector or list with default allocator to any depth
   //                   like vector<list<vector<int>>>
   //             negative val: STL container other than vector or list, or non default allocator
   //                           For example: vector<deque<int>> has answer -1

   if (strchr(type,'<')==0) return 0;

   TSplitType arglist( type );
   return arglist.IsSTLCont(testAlloc);
}

//______________________________________________________________________________
bool TClassEdit::IsStdClass(const char *classname)
{
   // return true if the class belond to the std namespace

   if ( strncmp(classname,"std::",5)==0 ) classname += 5;
   if ( strcmp(classname,"string")==0 ) return true;
   if ( strncmp(classname,"bitset<",strlen("bitset<"))==0) return true;
   if ( strncmp(classname,"pair<",strlen("pair<"))==0) return true;
   if ( strcmp(classname,"allocator")==0) return true;
   if ( strncmp(classname,"allocator<",strlen("allocator<"))==0) return true;
   if ( strncmp(classname,"greater<",strlen("greater<"))==0) return true;
   if ( strncmp(classname,"less<",strlen("less<"))==0) return true;
   if ( strncmp(classname,"auto_ptr<",strlen("auto_ptr<"))==0) return true;

   return IsSTLCont(classname) != 0;

}


//______________________________________________________________________________
bool TClassEdit::IsVectorBool(const char *name) {
   TSplitType splitname( name );

   return ( TClassEdit::STLKind( splitname.fElements[0].c_str() ) == TClassEdit::kVector)
      && ( splitname.fElements[1] == "bool" || splitname.fElements[1]=="Bool_t");
};

//______________________________________________________________________________
namespace {
   static bool ShouldReplace(const char *name)
   {
      // This helper function indicates whether we really want to replace
      // a type.

      const char *excludelist [] = {"Char_t","Short_t","Int_t","Long_t","Float_t",
                                    "Int_t","Double_t","Double32_t","Float16_t",
                                    "UChar_t","UShort_t","UInt_t","ULong_t","UInt_t",
                                    "Long64_t","ULong64_t","Bool_t"};

      for (unsigned int i=0; i < sizeof(excludelist)/sizeof(excludelist[0]); ++i) {
         if (strcmp(name,excludelist[i])==0) return false;
      }

      return true;
   }
}

//______________________________________________________________________________
string TClassEdit::ResolveTypedef(const char *tname, bool resolveAll)
{

   // Return the name of type 'tname' with all its typedef components replaced
   // by the actual type its points to
   // For example for "typedef MyObj MyObjTypedef;"
   //    vector<MyObjTypedef> return vector<MyObj>
   //

   if ( tname==0 || tname[0]==0 ) return "";

   if ( strchr(tname,'<')==0 && (tname[strlen(tname)-1]!='*') ) {

      if ( strchr(tname,':')!=0 ) {
         // We have a namespace an we have to check it first :(

         int slen = strlen(tname);
         for(int k=0;k<slen;++k) {
            if (tname[k]==':') {
               if (k+1>=slen || tname[k+1]!=':') {
                  // we expected another ':'
                  return tname;
               }
               if (k) {
                  string base(tname, 0, k);
                  if (base=="std") {
                     // std is not declared but is also ignored by CINT!
                     tname += 5;
                     break;
                  } else {
                     G__ClassInfo info(base.c_str());
                     if (!info.IsLoaded()) {
                        // the nesting namespace is not declared
                        return tname;
                     }
                  }
               }
            }
         }
      }

      // We have a very simple type

      if (resolveAll || ShouldReplace(tname)) {
         G__TypedefInfo t;
         t.Init(tname);
         if (t.IsValid()) return t.TrueName();
      }
      return tname;
   }

   int len = strlen(tname);
   string input(tname);
#ifdef R__SSTREAM
   // This is the modern implementation
   stringstream answ;
#else
   // This is deprecated in the C++ standard
   strstream answ;
#endif

   int prev = 0;
   for (int i=0; i<len; ++i) {
      switch (tname[i]) {
         case '<':
         case '>':
         case '*':
         case ' ':
         case '&':
         case ',':
         {
            char keep = input[i];
            string temp( input, prev,i-prev );

            if ( (resolveAll&&(temp!="Double32_t")&&(temp!="Float16_t")) || ShouldReplace(temp.c_str())) {
               answ << ResolveTypedef( temp.c_str(), resolveAll);
            } else {
               answ << temp;
            }
            answ << keep;
            prev = i+1;
         }
      }
   }
   const char *last = &(input.c_str()[prev]);
   if ((resolveAll&&(strcmp(last,"Double32_t")!=0)&&(strcmp(last,"Float16_t")!=0)) || ShouldReplace(last)) {
      answ << ResolveTypedef( last, resolveAll);
   } else {
      answ << last;
   }
#ifndef R__SSTREAM
   // Deprecated case
   answ << ends;
   std::string ret = answ.str();
   answ.freeze(false);
   return ret;
#else
   return answ.str();
#endif

}


//______________________________________________________________________________
string TClassEdit::InsertStd(const char *tname)
{

   // Return the name of type 'tname' with all STL classes prepended by "std::".
   // For example for "vector<set<auto_ptr<int*> > >" it returns
   //    "std::vector<std::set<std::auto_ptr<int*> > >"
   //

   static const char* sSTLtypes[] = {
      "allocator",
      "auto_ptr",
      "bad_alloc",
      "bad_cast",
      "bad_exception",
      "bad_typeid",
      "basic_filebuf",
      "basic_fstream",
      "basic_ifstream",
      "basic_ios",
      "basic_iostream",
      "basic_istream",
      "basic_istringstream",
      "basic_ofstream",
      "basic_ostream",
      "basic_ostringstream",
      "basic_streambuf",
      "basic_string",
      "basic_stringbuf",
      "basic_stringstream",
      "binary_function",
      "binary_negate",
      "bitset",
      "char_traits",
      "codecvt_byname",
      "codecvt",
      "collate",
      "collate_byname",
      "compare",
      "complex",
      "ctype_byname",
      "ctype",
      "deque",
      "divides",
      "domain_error",
      "equal_to",
      "exception",
      "fpos",
      "greater_equal",
      "greater",
      "gslice_array",
      "gslice",
      "indirect_array",
      "invalid_argument",
      "ios_base",
      "istream_iterator",
      "istreambuf_iterator",
      "istrstream",
      "iterator_traits",
      "iterator",
      "length_error",
      "less_equal",
      "less",
      "list",
      "locale",
      "localedef utility",
      "locale utility",
      "logic_error",
      "logical_and",
      "logical_not",
      "logical_or",
      "map",
      "mask_array",
      "mem_fun",
      "mem_fun_ref",
      "messages",
      "messages_byname",
      "minus",
      "modulus",
      "money_get",
      "money_put",
      "moneypunct",
      "moneypunct_byname",
      "multimap",
      "multiplies",
      "multiset",
      "negate",
      "not_equal_to",
      "num_get",
      "num_put",
      "numeric_limits",
      "numpunct",
      "numpunct_byname",
      "ostream_iterator",
      "ostreambuf_iterator",
      "ostrstream",
      "out_of_range",
      "overflow_error",
      "pair",
      "plus",
      "pointer_to_binary_function",
      "pointer_to_unary_function",
      "priority_queue",
      "queue",
      "range_error",
      "raw_storage_iterator",
      "reverse_iterator",
      "runtime_error",
      "set",
      "slice_array",
      "slice",
      "stack",
      "string",
      "strstream",
      "strstreambuf",
      "time_get_byname",
      "time_get",
      "time_put_byname",
      "time_put",
      "unary_function",
      "unary_negate",
      "underflow_error",
      "valarray",
      "vector",
      "wstring"
   };
   static set<string> sSetSTLtypes;

   if (tname==0 || tname[0]==0) return "";

   if (sSetSTLtypes.empty()) {
      // set up static set
      const size_t nSTLtypes = sizeof(sSTLtypes) / sizeof(const char*);
      for (size_t i = 0; i < nSTLtypes; ++i)
         sSetSTLtypes.insert(sSTLtypes[i]);
   }

   size_t b = 0;
   size_t len = strlen(tname);
   string ret;
   ret.reserve(len + 20); // expect up to 4 extra "std::" to insert
   string id;
   while (b < len) {
      // find beginning of next identifier
      bool precScope = false; // whether the identifier was preceded by "::"
      while (!(isalnum(tname[b]) || tname[b] == '_') && b < len) {
         precScope = (b < len - 2) && (tname[b] == ':') && (tname[b + 1] == ':');
         if (precScope) {
            ret += "::";
            b += 2;
         } else
            ret += tname[b++];
      }

      // now b is at the beginning of an identifier or len
      size_t e = b;
      // find end of identifier
      id.clear();
      while (e < len && (isalnum(tname[e]) || tname[e] == '_'))
         id += tname[e++];
      if (!id.empty()) {
         if (!precScope) {
            set<string>::const_iterator iSTLtype = sSetSTLtypes.find(id);
            if (iSTLtype != sSetSTLtypes.end())
               ret += "std::";
         }

         ret += id;
         b = e;
      }
   }
   return ret;
}


 TClassEdit.cxx:1
 TClassEdit.cxx:2
 TClassEdit.cxx:3
 TClassEdit.cxx:4
 TClassEdit.cxx:5
 TClassEdit.cxx:6
 TClassEdit.cxx:7
 TClassEdit.cxx:8
 TClassEdit.cxx:9
 TClassEdit.cxx:10
 TClassEdit.cxx:11
 TClassEdit.cxx:12
 TClassEdit.cxx:13
 TClassEdit.cxx:14
 TClassEdit.cxx:15
 TClassEdit.cxx:16
 TClassEdit.cxx:17
 TClassEdit.cxx:18
 TClassEdit.cxx:19
 TClassEdit.cxx:20
 TClassEdit.cxx:21
 TClassEdit.cxx:22
 TClassEdit.cxx:23
 TClassEdit.cxx:24
 TClassEdit.cxx:25
 TClassEdit.cxx:26
 TClassEdit.cxx:27
 TClassEdit.cxx:28
 TClassEdit.cxx:29
 TClassEdit.cxx:30
 TClassEdit.cxx:31
 TClassEdit.cxx:32
 TClassEdit.cxx:33
 TClassEdit.cxx:34
 TClassEdit.cxx:35
 TClassEdit.cxx:36
 TClassEdit.cxx:37
 TClassEdit.cxx:38
 TClassEdit.cxx:39
 TClassEdit.cxx:40
 TClassEdit.cxx:41
 TClassEdit.cxx:42
 TClassEdit.cxx:43
 TClassEdit.cxx:44
 TClassEdit.cxx:45
 TClassEdit.cxx:46
 TClassEdit.cxx:47
 TClassEdit.cxx:48
 TClassEdit.cxx:49
 TClassEdit.cxx:50
 TClassEdit.cxx:51
 TClassEdit.cxx:52
 TClassEdit.cxx:53
 TClassEdit.cxx:54
 TClassEdit.cxx:55
 TClassEdit.cxx:56
 TClassEdit.cxx:57
 TClassEdit.cxx:58
 TClassEdit.cxx:59
 TClassEdit.cxx:60
 TClassEdit.cxx:61
 TClassEdit.cxx:62
 TClassEdit.cxx:63
 TClassEdit.cxx:64
 TClassEdit.cxx:65
 TClassEdit.cxx:66
 TClassEdit.cxx:67
 TClassEdit.cxx:68
 TClassEdit.cxx:69
 TClassEdit.cxx:70
 TClassEdit.cxx:71
 TClassEdit.cxx:72
 TClassEdit.cxx:73
 TClassEdit.cxx:74
 TClassEdit.cxx:75
 TClassEdit.cxx:76
 TClassEdit.cxx:77
 TClassEdit.cxx:78
 TClassEdit.cxx:79
 TClassEdit.cxx:80
 TClassEdit.cxx:81
 TClassEdit.cxx:82
 TClassEdit.cxx:83
 TClassEdit.cxx:84
 TClassEdit.cxx:85
 TClassEdit.cxx:86
 TClassEdit.cxx:87
 TClassEdit.cxx:88
 TClassEdit.cxx:89
 TClassEdit.cxx:90
 TClassEdit.cxx:91
 TClassEdit.cxx:92
 TClassEdit.cxx:93
 TClassEdit.cxx:94
 TClassEdit.cxx:95
 TClassEdit.cxx:96
 TClassEdit.cxx:97
 TClassEdit.cxx:98
 TClassEdit.cxx:99
 TClassEdit.cxx:100
 TClassEdit.cxx:101
 TClassEdit.cxx:102
 TClassEdit.cxx:103
 TClassEdit.cxx:104
 TClassEdit.cxx:105
 TClassEdit.cxx:106
 TClassEdit.cxx:107
 TClassEdit.cxx:108
 TClassEdit.cxx:109
 TClassEdit.cxx:110
 TClassEdit.cxx:111
 TClassEdit.cxx:112
 TClassEdit.cxx:113
 TClassEdit.cxx:114
 TClassEdit.cxx:115
 TClassEdit.cxx:116
 TClassEdit.cxx:117
 TClassEdit.cxx:118
 TClassEdit.cxx:119
 TClassEdit.cxx:120
 TClassEdit.cxx:121
 TClassEdit.cxx:122
 TClassEdit.cxx:123
 TClassEdit.cxx:124
 TClassEdit.cxx:125
 TClassEdit.cxx:126
 TClassEdit.cxx:127
 TClassEdit.cxx:128
 TClassEdit.cxx:129
 TClassEdit.cxx:130
 TClassEdit.cxx:131
 TClassEdit.cxx:132
 TClassEdit.cxx:133
 TClassEdit.cxx:134
 TClassEdit.cxx:135
 TClassEdit.cxx:136
 TClassEdit.cxx:137
 TClassEdit.cxx:138
 TClassEdit.cxx:139
 TClassEdit.cxx:140
 TClassEdit.cxx:141
 TClassEdit.cxx:142
 TClassEdit.cxx:143
 TClassEdit.cxx:144
 TClassEdit.cxx:145
 TClassEdit.cxx:146
 TClassEdit.cxx:147
 TClassEdit.cxx:148
 TClassEdit.cxx:149
 TClassEdit.cxx:150
 TClassEdit.cxx:151
 TClassEdit.cxx:152
 TClassEdit.cxx:153
 TClassEdit.cxx:154
 TClassEdit.cxx:155
 TClassEdit.cxx:156
 TClassEdit.cxx:157
 TClassEdit.cxx:158
 TClassEdit.cxx:159
 TClassEdit.cxx:160
 TClassEdit.cxx:161
 TClassEdit.cxx:162
 TClassEdit.cxx:163
 TClassEdit.cxx:164
 TClassEdit.cxx:165
 TClassEdit.cxx:166
 TClassEdit.cxx:167
 TClassEdit.cxx:168
 TClassEdit.cxx:169
 TClassEdit.cxx:170
 TClassEdit.cxx:171
 TClassEdit.cxx:172
 TClassEdit.cxx:173
 TClassEdit.cxx:174
 TClassEdit.cxx:175
 TClassEdit.cxx:176
 TClassEdit.cxx:177
 TClassEdit.cxx:178
 TClassEdit.cxx:179
 TClassEdit.cxx:180
 TClassEdit.cxx:181
 TClassEdit.cxx:182
 TClassEdit.cxx:183
 TClassEdit.cxx:184
 TClassEdit.cxx:185
 TClassEdit.cxx:186
 TClassEdit.cxx:187
 TClassEdit.cxx:188
 TClassEdit.cxx:189
 TClassEdit.cxx:190
 TClassEdit.cxx:191
 TClassEdit.cxx:192
 TClassEdit.cxx:193
 TClassEdit.cxx:194
 TClassEdit.cxx:195
 TClassEdit.cxx:196
 TClassEdit.cxx:197
 TClassEdit.cxx:198
 TClassEdit.cxx:199
 TClassEdit.cxx:200
 TClassEdit.cxx:201
 TClassEdit.cxx:202
 TClassEdit.cxx:203
 TClassEdit.cxx:204
 TClassEdit.cxx:205
 TClassEdit.cxx:206
 TClassEdit.cxx:207
 TClassEdit.cxx:208
 TClassEdit.cxx:209
 TClassEdit.cxx:210
 TClassEdit.cxx:211
 TClassEdit.cxx:212
 TClassEdit.cxx:213
 TClassEdit.cxx:214
 TClassEdit.cxx:215
 TClassEdit.cxx:216
 TClassEdit.cxx:217
 TClassEdit.cxx:218
 TClassEdit.cxx:219
 TClassEdit.cxx:220
 TClassEdit.cxx:221
 TClassEdit.cxx:222
 TClassEdit.cxx:223
 TClassEdit.cxx:224
 TClassEdit.cxx:225
 TClassEdit.cxx:226
 TClassEdit.cxx:227
 TClassEdit.cxx:228
 TClassEdit.cxx:229
 TClassEdit.cxx:230
 TClassEdit.cxx:231
 TClassEdit.cxx:232
 TClassEdit.cxx:233
 TClassEdit.cxx:234
 TClassEdit.cxx:235
 TClassEdit.cxx:236
 TClassEdit.cxx:237
 TClassEdit.cxx:238
 TClassEdit.cxx:239
 TClassEdit.cxx:240
 TClassEdit.cxx:241
 TClassEdit.cxx:242
 TClassEdit.cxx:243
 TClassEdit.cxx:244
 TClassEdit.cxx:245
 TClassEdit.cxx:246
 TClassEdit.cxx:247
 TClassEdit.cxx:248
 TClassEdit.cxx:249
 TClassEdit.cxx:250
 TClassEdit.cxx:251
 TClassEdit.cxx:252
 TClassEdit.cxx:253
 TClassEdit.cxx:254
 TClassEdit.cxx:255
 TClassEdit.cxx:256
 TClassEdit.cxx:257
 TClassEdit.cxx:258
 TClassEdit.cxx:259
 TClassEdit.cxx:260
 TClassEdit.cxx:261
 TClassEdit.cxx:262
 TClassEdit.cxx:263
 TClassEdit.cxx:264
 TClassEdit.cxx:265
 TClassEdit.cxx:266
 TClassEdit.cxx:267
 TClassEdit.cxx:268
 TClassEdit.cxx:269
 TClassEdit.cxx:270
 TClassEdit.cxx:271
 TClassEdit.cxx:272
 TClassEdit.cxx:273
 TClassEdit.cxx:274
 TClassEdit.cxx:275
 TClassEdit.cxx:276
 TClassEdit.cxx:277
 TClassEdit.cxx:278
 TClassEdit.cxx:279
 TClassEdit.cxx:280
 TClassEdit.cxx:281
 TClassEdit.cxx:282
 TClassEdit.cxx:283
 TClassEdit.cxx:284
 TClassEdit.cxx:285
 TClassEdit.cxx:286
 TClassEdit.cxx:287
 TClassEdit.cxx:288
 TClassEdit.cxx:289
 TClassEdit.cxx:290
 TClassEdit.cxx:291
 TClassEdit.cxx:292
 TClassEdit.cxx:293
 TClassEdit.cxx:294
 TClassEdit.cxx:295
 TClassEdit.cxx:296
 TClassEdit.cxx:297
 TClassEdit.cxx:298
 TClassEdit.cxx:299
 TClassEdit.cxx:300
 TClassEdit.cxx:301
 TClassEdit.cxx:302
 TClassEdit.cxx:303
 TClassEdit.cxx:304
 TClassEdit.cxx:305
 TClassEdit.cxx:306
 TClassEdit.cxx:307
 TClassEdit.cxx:308
 TClassEdit.cxx:309
 TClassEdit.cxx:310
 TClassEdit.cxx:311
 TClassEdit.cxx:312
 TClassEdit.cxx:313
 TClassEdit.cxx:314
 TClassEdit.cxx:315
 TClassEdit.cxx:316
 TClassEdit.cxx:317
 TClassEdit.cxx:318
 TClassEdit.cxx:319
 TClassEdit.cxx:320
 TClassEdit.cxx:321
 TClassEdit.cxx:322
 TClassEdit.cxx:323
 TClassEdit.cxx:324
 TClassEdit.cxx:325
 TClassEdit.cxx:326
 TClassEdit.cxx:327
 TClassEdit.cxx:328
 TClassEdit.cxx:329
 TClassEdit.cxx:330
 TClassEdit.cxx:331
 TClassEdit.cxx:332
 TClassEdit.cxx:333
 TClassEdit.cxx:334
 TClassEdit.cxx:335
 TClassEdit.cxx:336
 TClassEdit.cxx:337
 TClassEdit.cxx:338
 TClassEdit.cxx:339
 TClassEdit.cxx:340
 TClassEdit.cxx:341
 TClassEdit.cxx:342
 TClassEdit.cxx:343
 TClassEdit.cxx:344
 TClassEdit.cxx:345
 TClassEdit.cxx:346
 TClassEdit.cxx:347
 TClassEdit.cxx:348
 TClassEdit.cxx:349
 TClassEdit.cxx:350
 TClassEdit.cxx:351
 TClassEdit.cxx:352
 TClassEdit.cxx:353
 TClassEdit.cxx:354
 TClassEdit.cxx:355
 TClassEdit.cxx:356
 TClassEdit.cxx:357
 TClassEdit.cxx:358
 TClassEdit.cxx:359
 TClassEdit.cxx:360
 TClassEdit.cxx:361
 TClassEdit.cxx:362
 TClassEdit.cxx:363
 TClassEdit.cxx:364
 TClassEdit.cxx:365
 TClassEdit.cxx:366
 TClassEdit.cxx:367
 TClassEdit.cxx:368
 TClassEdit.cxx:369
 TClassEdit.cxx:370
 TClassEdit.cxx:371
 TClassEdit.cxx:372
 TClassEdit.cxx:373
 TClassEdit.cxx:374
 TClassEdit.cxx:375
 TClassEdit.cxx:376
 TClassEdit.cxx:377
 TClassEdit.cxx:378
 TClassEdit.cxx:379
 TClassEdit.cxx:380
 TClassEdit.cxx:381
 TClassEdit.cxx:382
 TClassEdit.cxx:383
 TClassEdit.cxx:384
 TClassEdit.cxx:385
 TClassEdit.cxx:386
 TClassEdit.cxx:387
 TClassEdit.cxx:388
 TClassEdit.cxx:389
 TClassEdit.cxx:390
 TClassEdit.cxx:391
 TClassEdit.cxx:392
 TClassEdit.cxx:393
 TClassEdit.cxx:394
 TClassEdit.cxx:395
 TClassEdit.cxx:396
 TClassEdit.cxx:397
 TClassEdit.cxx:398
 TClassEdit.cxx:399
 TClassEdit.cxx:400
 TClassEdit.cxx:401
 TClassEdit.cxx:402
 TClassEdit.cxx:403
 TClassEdit.cxx:404
 TClassEdit.cxx:405
 TClassEdit.cxx:406
 TClassEdit.cxx:407
 TClassEdit.cxx:408
 TClassEdit.cxx:409
 TClassEdit.cxx:410
 TClassEdit.cxx:411
 TClassEdit.cxx:412
 TClassEdit.cxx:413
 TClassEdit.cxx:414
 TClassEdit.cxx:415
 TClassEdit.cxx:416
 TClassEdit.cxx:417
 TClassEdit.cxx:418
 TClassEdit.cxx:419
 TClassEdit.cxx:420
 TClassEdit.cxx:421
 TClassEdit.cxx:422
 TClassEdit.cxx:423
 TClassEdit.cxx:424
 TClassEdit.cxx:425
 TClassEdit.cxx:426
 TClassEdit.cxx:427
 TClassEdit.cxx:428
 TClassEdit.cxx:429
 TClassEdit.cxx:430
 TClassEdit.cxx:431
 TClassEdit.cxx:432
 TClassEdit.cxx:433
 TClassEdit.cxx:434
 TClassEdit.cxx:435
 TClassEdit.cxx:436
 TClassEdit.cxx:437
 TClassEdit.cxx:438
 TClassEdit.cxx:439
 TClassEdit.cxx:440
 TClassEdit.cxx:441
 TClassEdit.cxx:442
 TClassEdit.cxx:443
 TClassEdit.cxx:444
 TClassEdit.cxx:445
 TClassEdit.cxx:446
 TClassEdit.cxx:447
 TClassEdit.cxx:448
 TClassEdit.cxx:449
 TClassEdit.cxx:450
 TClassEdit.cxx:451
 TClassEdit.cxx:452
 TClassEdit.cxx:453
 TClassEdit.cxx:454
 TClassEdit.cxx:455
 TClassEdit.cxx:456
 TClassEdit.cxx:457
 TClassEdit.cxx:458
 TClassEdit.cxx:459
 TClassEdit.cxx:460
 TClassEdit.cxx:461
 TClassEdit.cxx:462
 TClassEdit.cxx:463
 TClassEdit.cxx:464
 TClassEdit.cxx:465
 TClassEdit.cxx:466
 TClassEdit.cxx:467
 TClassEdit.cxx:468
 TClassEdit.cxx:469
 TClassEdit.cxx:470
 TClassEdit.cxx:471
 TClassEdit.cxx:472
 TClassEdit.cxx:473
 TClassEdit.cxx:474
 TClassEdit.cxx:475
 TClassEdit.cxx:476
 TClassEdit.cxx:477
 TClassEdit.cxx:478
 TClassEdit.cxx:479
 TClassEdit.cxx:480
 TClassEdit.cxx:481
 TClassEdit.cxx:482
 TClassEdit.cxx:483
 TClassEdit.cxx:484
 TClassEdit.cxx:485
 TClassEdit.cxx:486
 TClassEdit.cxx:487
 TClassEdit.cxx:488
 TClassEdit.cxx:489
 TClassEdit.cxx:490
 TClassEdit.cxx:491
 TClassEdit.cxx:492
 TClassEdit.cxx:493
 TClassEdit.cxx:494
 TClassEdit.cxx:495
 TClassEdit.cxx:496
 TClassEdit.cxx:497
 TClassEdit.cxx:498
 TClassEdit.cxx:499
 TClassEdit.cxx:500
 TClassEdit.cxx:501
 TClassEdit.cxx:502
 TClassEdit.cxx:503
 TClassEdit.cxx:504
 TClassEdit.cxx:505
 TClassEdit.cxx:506
 TClassEdit.cxx:507
 TClassEdit.cxx:508
 TClassEdit.cxx:509
 TClassEdit.cxx:510
 TClassEdit.cxx:511
 TClassEdit.cxx:512
 TClassEdit.cxx:513
 TClassEdit.cxx:514
 TClassEdit.cxx:515
 TClassEdit.cxx:516
 TClassEdit.cxx:517
 TClassEdit.cxx:518
 TClassEdit.cxx:519
 TClassEdit.cxx:520
 TClassEdit.cxx:521
 TClassEdit.cxx:522
 TClassEdit.cxx:523
 TClassEdit.cxx:524
 TClassEdit.cxx:525
 TClassEdit.cxx:526
 TClassEdit.cxx:527
 TClassEdit.cxx:528
 TClassEdit.cxx:529
 TClassEdit.cxx:530
 TClassEdit.cxx:531
 TClassEdit.cxx:532
 TClassEdit.cxx:533
 TClassEdit.cxx:534
 TClassEdit.cxx:535
 TClassEdit.cxx:536
 TClassEdit.cxx:537
 TClassEdit.cxx:538
 TClassEdit.cxx:539
 TClassEdit.cxx:540
 TClassEdit.cxx:541
 TClassEdit.cxx:542
 TClassEdit.cxx:543
 TClassEdit.cxx:544
 TClassEdit.cxx:545
 TClassEdit.cxx:546
 TClassEdit.cxx:547
 TClassEdit.cxx:548
 TClassEdit.cxx:549
 TClassEdit.cxx:550
 TClassEdit.cxx:551
 TClassEdit.cxx:552
 TClassEdit.cxx:553
 TClassEdit.cxx:554
 TClassEdit.cxx:555
 TClassEdit.cxx:556
 TClassEdit.cxx:557
 TClassEdit.cxx:558
 TClassEdit.cxx:559
 TClassEdit.cxx:560
 TClassEdit.cxx:561
 TClassEdit.cxx:562
 TClassEdit.cxx:563
 TClassEdit.cxx:564
 TClassEdit.cxx:565
 TClassEdit.cxx:566
 TClassEdit.cxx:567
 TClassEdit.cxx:568
 TClassEdit.cxx:569
 TClassEdit.cxx:570
 TClassEdit.cxx:571
 TClassEdit.cxx:572
 TClassEdit.cxx:573
 TClassEdit.cxx:574
 TClassEdit.cxx:575
 TClassEdit.cxx:576
 TClassEdit.cxx:577
 TClassEdit.cxx:578
 TClassEdit.cxx:579
 TClassEdit.cxx:580
 TClassEdit.cxx:581
 TClassEdit.cxx:582
 TClassEdit.cxx:583
 TClassEdit.cxx:584
 TClassEdit.cxx:585
 TClassEdit.cxx:586
 TClassEdit.cxx:587
 TClassEdit.cxx:588
 TClassEdit.cxx:589
 TClassEdit.cxx:590
 TClassEdit.cxx:591
 TClassEdit.cxx:592
 TClassEdit.cxx:593
 TClassEdit.cxx:594
 TClassEdit.cxx:595
 TClassEdit.cxx:596
 TClassEdit.cxx:597
 TClassEdit.cxx:598
 TClassEdit.cxx:599
 TClassEdit.cxx:600
 TClassEdit.cxx:601
 TClassEdit.cxx:602
 TClassEdit.cxx:603
 TClassEdit.cxx:604
 TClassEdit.cxx:605
 TClassEdit.cxx:606
 TClassEdit.cxx:607
 TClassEdit.cxx:608
 TClassEdit.cxx:609
 TClassEdit.cxx:610
 TClassEdit.cxx:611
 TClassEdit.cxx:612
 TClassEdit.cxx:613
 TClassEdit.cxx:614
 TClassEdit.cxx:615
 TClassEdit.cxx:616
 TClassEdit.cxx:617
 TClassEdit.cxx:618
 TClassEdit.cxx:619
 TClassEdit.cxx:620
 TClassEdit.cxx:621
 TClassEdit.cxx:622
 TClassEdit.cxx:623
 TClassEdit.cxx:624
 TClassEdit.cxx:625
 TClassEdit.cxx:626
 TClassEdit.cxx:627
 TClassEdit.cxx:628
 TClassEdit.cxx:629
 TClassEdit.cxx:630
 TClassEdit.cxx:631
 TClassEdit.cxx:632
 TClassEdit.cxx:633
 TClassEdit.cxx:634
 TClassEdit.cxx:635
 TClassEdit.cxx:636
 TClassEdit.cxx:637
 TClassEdit.cxx:638
 TClassEdit.cxx:639
 TClassEdit.cxx:640
 TClassEdit.cxx:641
 TClassEdit.cxx:642
 TClassEdit.cxx:643
 TClassEdit.cxx:644
 TClassEdit.cxx:645
 TClassEdit.cxx:646
 TClassEdit.cxx:647
 TClassEdit.cxx:648
 TClassEdit.cxx:649
 TClassEdit.cxx:650
 TClassEdit.cxx:651
 TClassEdit.cxx:652
 TClassEdit.cxx:653
 TClassEdit.cxx:654
 TClassEdit.cxx:655
 TClassEdit.cxx:656
 TClassEdit.cxx:657
 TClassEdit.cxx:658
 TClassEdit.cxx:659
 TClassEdit.cxx:660
 TClassEdit.cxx:661
 TClassEdit.cxx:662
 TClassEdit.cxx:663
 TClassEdit.cxx:664
 TClassEdit.cxx:665
 TClassEdit.cxx:666
 TClassEdit.cxx:667
 TClassEdit.cxx:668
 TClassEdit.cxx:669
 TClassEdit.cxx:670
 TClassEdit.cxx:671
 TClassEdit.cxx:672
 TClassEdit.cxx:673
 TClassEdit.cxx:674
 TClassEdit.cxx:675
 TClassEdit.cxx:676
 TClassEdit.cxx:677
 TClassEdit.cxx:678
 TClassEdit.cxx:679
 TClassEdit.cxx:680
 TClassEdit.cxx:681
 TClassEdit.cxx:682
 TClassEdit.cxx:683
 TClassEdit.cxx:684
 TClassEdit.cxx:685
 TClassEdit.cxx:686
 TClassEdit.cxx:687
 TClassEdit.cxx:688
 TClassEdit.cxx:689
 TClassEdit.cxx:690
 TClassEdit.cxx:691
 TClassEdit.cxx:692
 TClassEdit.cxx:693
 TClassEdit.cxx:694
 TClassEdit.cxx:695
 TClassEdit.cxx:696
 TClassEdit.cxx:697
 TClassEdit.cxx:698
 TClassEdit.cxx:699
 TClassEdit.cxx:700
 TClassEdit.cxx:701
 TClassEdit.cxx:702
 TClassEdit.cxx:703
 TClassEdit.cxx:704
 TClassEdit.cxx:705
 TClassEdit.cxx:706
 TClassEdit.cxx:707
 TClassEdit.cxx:708
 TClassEdit.cxx:709
 TClassEdit.cxx:710
 TClassEdit.cxx:711
 TClassEdit.cxx:712
 TClassEdit.cxx:713
 TClassEdit.cxx:714
 TClassEdit.cxx:715
 TClassEdit.cxx:716
 TClassEdit.cxx:717
 TClassEdit.cxx:718
 TClassEdit.cxx:719
 TClassEdit.cxx:720
 TClassEdit.cxx:721
 TClassEdit.cxx:722
 TClassEdit.cxx:723
 TClassEdit.cxx:724
 TClassEdit.cxx:725
 TClassEdit.cxx:726
 TClassEdit.cxx:727
 TClassEdit.cxx:728
 TClassEdit.cxx:729
 TClassEdit.cxx:730
 TClassEdit.cxx:731
 TClassEdit.cxx:732
 TClassEdit.cxx:733
 TClassEdit.cxx:734
 TClassEdit.cxx:735
 TClassEdit.cxx:736
 TClassEdit.cxx:737
 TClassEdit.cxx:738
 TClassEdit.cxx:739
 TClassEdit.cxx:740
 TClassEdit.cxx:741
 TClassEdit.cxx:742
 TClassEdit.cxx:743
 TClassEdit.cxx:744
 TClassEdit.cxx:745
 TClassEdit.cxx:746
 TClassEdit.cxx:747
 TClassEdit.cxx:748
 TClassEdit.cxx:749
 TClassEdit.cxx:750
 TClassEdit.cxx:751
 TClassEdit.cxx:752
 TClassEdit.cxx:753
 TClassEdit.cxx:754
 TClassEdit.cxx:755
 TClassEdit.cxx:756
 TClassEdit.cxx:757
 TClassEdit.cxx:758
 TClassEdit.cxx:759
 TClassEdit.cxx:760
 TClassEdit.cxx:761
 TClassEdit.cxx:762
 TClassEdit.cxx:763
 TClassEdit.cxx:764
 TClassEdit.cxx:765
 TClassEdit.cxx:766
 TClassEdit.cxx:767
 TClassEdit.cxx:768
 TClassEdit.cxx:769
 TClassEdit.cxx:770
 TClassEdit.cxx:771
 TClassEdit.cxx:772
 TClassEdit.cxx:773
 TClassEdit.cxx:774
 TClassEdit.cxx:775
 TClassEdit.cxx:776
 TClassEdit.cxx:777
 TClassEdit.cxx:778
 TClassEdit.cxx:779
 TClassEdit.cxx:780
 TClassEdit.cxx:781
 TClassEdit.cxx:782
 TClassEdit.cxx:783
 TClassEdit.cxx:784
 TClassEdit.cxx:785
 TClassEdit.cxx:786
 TClassEdit.cxx:787
 TClassEdit.cxx:788
 TClassEdit.cxx:789
 TClassEdit.cxx:790
 TClassEdit.cxx:791
 TClassEdit.cxx:792
 TClassEdit.cxx:793
 TClassEdit.cxx:794
 TClassEdit.cxx:795
 TClassEdit.cxx:796
 TClassEdit.cxx:797
 TClassEdit.cxx:798
 TClassEdit.cxx:799
 TClassEdit.cxx:800
 TClassEdit.cxx:801
 TClassEdit.cxx:802
 TClassEdit.cxx:803
 TClassEdit.cxx:804
 TClassEdit.cxx:805
 TClassEdit.cxx:806
 TClassEdit.cxx:807
 TClassEdit.cxx:808
 TClassEdit.cxx:809
 TClassEdit.cxx:810
 TClassEdit.cxx:811
 TClassEdit.cxx:812
 TClassEdit.cxx:813
 TClassEdit.cxx:814
 TClassEdit.cxx:815
 TClassEdit.cxx:816
 TClassEdit.cxx:817
 TClassEdit.cxx:818
 TClassEdit.cxx:819
 TClassEdit.cxx:820
 TClassEdit.cxx:821
 TClassEdit.cxx:822
 TClassEdit.cxx:823
 TClassEdit.cxx:824
 TClassEdit.cxx:825
 TClassEdit.cxx:826
 TClassEdit.cxx:827
 TClassEdit.cxx:828
 TClassEdit.cxx:829
 TClassEdit.cxx:830
 TClassEdit.cxx:831
 TClassEdit.cxx:832
 TClassEdit.cxx:833
 TClassEdit.cxx:834
 TClassEdit.cxx:835
 TClassEdit.cxx:836
 TClassEdit.cxx:837
 TClassEdit.cxx:838
 TClassEdit.cxx:839
 TClassEdit.cxx:840
 TClassEdit.cxx:841
 TClassEdit.cxx:842
 TClassEdit.cxx:843
 TClassEdit.cxx:844
 TClassEdit.cxx:845
 TClassEdit.cxx:846
 TClassEdit.cxx:847
 TClassEdit.cxx:848
 TClassEdit.cxx:849
 TClassEdit.cxx:850
 TClassEdit.cxx:851
 TClassEdit.cxx:852
 TClassEdit.cxx:853
 TClassEdit.cxx:854
 TClassEdit.cxx:855
 TClassEdit.cxx:856
 TClassEdit.cxx:857
 TClassEdit.cxx:858
 TClassEdit.cxx:859
 TClassEdit.cxx:860
 TClassEdit.cxx:861
 TClassEdit.cxx:862
 TClassEdit.cxx:863
 TClassEdit.cxx:864
 TClassEdit.cxx:865
 TClassEdit.cxx:866
 TClassEdit.cxx:867
 TClassEdit.cxx:868
 TClassEdit.cxx:869
 TClassEdit.cxx:870
 TClassEdit.cxx:871
 TClassEdit.cxx:872
 TClassEdit.cxx:873
 TClassEdit.cxx:874
 TClassEdit.cxx:875
 TClassEdit.cxx:876
 TClassEdit.cxx:877
 TClassEdit.cxx:878
 TClassEdit.cxx:879
 TClassEdit.cxx:880
 TClassEdit.cxx:881
 TClassEdit.cxx:882
 TClassEdit.cxx:883
 TClassEdit.cxx:884
 TClassEdit.cxx:885
 TClassEdit.cxx:886
 TClassEdit.cxx:887
 TClassEdit.cxx:888
 TClassEdit.cxx:889
 TClassEdit.cxx:890
 TClassEdit.cxx:891
 TClassEdit.cxx:892
 TClassEdit.cxx:893
 TClassEdit.cxx:894
 TClassEdit.cxx:895
 TClassEdit.cxx:896
 TClassEdit.cxx:897
 TClassEdit.cxx:898
 TClassEdit.cxx:899
 TClassEdit.cxx:900
 TClassEdit.cxx:901
 TClassEdit.cxx:902
 TClassEdit.cxx:903
 TClassEdit.cxx:904
 TClassEdit.cxx:905
 TClassEdit.cxx:906
 TClassEdit.cxx:907
 TClassEdit.cxx:908
 TClassEdit.cxx:909
 TClassEdit.cxx:910
 TClassEdit.cxx:911
 TClassEdit.cxx:912
 TClassEdit.cxx:913
 TClassEdit.cxx:914
 TClassEdit.cxx:915
 TClassEdit.cxx:916
 TClassEdit.cxx:917
 TClassEdit.cxx:918
 TClassEdit.cxx:919
 TClassEdit.cxx:920
 TClassEdit.cxx:921
 TClassEdit.cxx:922
 TClassEdit.cxx:923
 TClassEdit.cxx:924
 TClassEdit.cxx:925
 TClassEdit.cxx:926
 TClassEdit.cxx:927
 TClassEdit.cxx:928
 TClassEdit.cxx:929
 TClassEdit.cxx:930
 TClassEdit.cxx:931
 TClassEdit.cxx:932
 TClassEdit.cxx:933
 TClassEdit.cxx:934
 TClassEdit.cxx:935
 TClassEdit.cxx:936
 TClassEdit.cxx:937
 TClassEdit.cxx:938
 TClassEdit.cxx:939
 TClassEdit.cxx:940
 TClassEdit.cxx:941
 TClassEdit.cxx:942
 TClassEdit.cxx:943
 TClassEdit.cxx:944
 TClassEdit.cxx:945
 TClassEdit.cxx:946
 TClassEdit.cxx:947
 TClassEdit.cxx:948
 TClassEdit.cxx:949
 TClassEdit.cxx:950
 TClassEdit.cxx:951
 TClassEdit.cxx:952
 TClassEdit.cxx:953
 TClassEdit.cxx:954
 TClassEdit.cxx:955
 TClassEdit.cxx:956
 TClassEdit.cxx:957
 TClassEdit.cxx:958
 TClassEdit.cxx:959
 TClassEdit.cxx:960
 TClassEdit.cxx:961
 TClassEdit.cxx:962
 TClassEdit.cxx:963
 TClassEdit.cxx:964
 TClassEdit.cxx:965
 TClassEdit.cxx:966
 TClassEdit.cxx:967
 TClassEdit.cxx:968
 TClassEdit.cxx:969
 TClassEdit.cxx:970
 TClassEdit.cxx:971
 TClassEdit.cxx:972
 TClassEdit.cxx:973
 TClassEdit.cxx:974
 TClassEdit.cxx:975
 TClassEdit.cxx:976
 TClassEdit.cxx:977
 TClassEdit.cxx:978
 TClassEdit.cxx:979
 TClassEdit.cxx:980
 TClassEdit.cxx:981
 TClassEdit.cxx:982
 TClassEdit.cxx:983
 TClassEdit.cxx:984
 TClassEdit.cxx:985
 TClassEdit.cxx:986
 TClassEdit.cxx:987
 TClassEdit.cxx:988
 TClassEdit.cxx:989
 TClassEdit.cxx:990
 TClassEdit.cxx:991
 TClassEdit.cxx:992
 TClassEdit.cxx:993
 TClassEdit.cxx:994
 TClassEdit.cxx:995