// @(#)root/base:$Name:  $:$Id: TClassEdit.h,v 1.6 2004/01/31 08:59:09 brun Exp $
// Author: Victor Perev   10/04/2003
//         Philippe Canal 05/2004

#ifndef ROOT_TClassEdit
#define ROOT_TClassEdit

#include "RConfig.h"
#include <string>
#include <vector>

#ifdef R__HPUX
namespace std {
   using ::string;
   using ::vector;
}
#endif

// TClassEdit is used to manipulate class and type names.
//
// This class does not dependent on any other ROOT facility
// so that it can be used by rootcint.

class TClassEdit{
public:
   enum { kDropTrailStar    = 1<<0,
          kDropDefaultAlloc = 1<<1,
          kDropAlloc        = 1<<2,
          kInnerClass       = 1<<3,
          kInnedMostClass   = 1<<4,
          kDropStlDefault   = 1<<5, /* implies kDropDefaultAlloc */
          kDropComparator   = 1<<6  /* if the class has a comparator, drops BOTH the comparator and the Allocator */
   };

   enum { 
      kNone     = 0,
      kVector   = 1,
      kList     = 2,
      kDeque    = 3,
      kMap      = 4,
      kMultiMap = 5,
      kSet      = 6,
      kMultiSet = 7,
      kEnd      = 8
   };

          
   static std::string CleanType (const char *typeDesc,int mode = 0,const char **tail=0);
   static bool        IsDefAlloc(const char *alloc, const char *classname);
   static bool        IsDefAlloc(const char *alloc, const char *keyclassname, const char *valueclassname);
   static bool        IsDefComp (const char *comp , const char *classname);
   static int         IsSTLCont (const char *type,int testAlloc=0);
   static bool        IsStdClass(const char *type);
   static bool        IsVectorBool(const char *name);
   static int         GetSplit  (const char *type, std::vector<std::string> &output);
   static int         STLKind   (const char *type);    //Kind of stl container
   static int         STLArgs   (int kind);            //Min number of arguments without allocator
   static std::string ResolveTypedef(const char *tname, bool resolveAll = false);
   static std::string ShortType (const char *typeDesc, int mode);
};

#endif
