// @(#)root/meta:$Id$
// Author: Rene Brun   04/02/95

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TDataType
#define ROOT_TDataType


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDataType                                                            //
//                                                                      //
// Basic data type descriptor (datatype information is obtained from    //
// CINT).                                                               //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TDictionary
#include "TDictionary.h"
#endif


enum EDataType {
   kChar_t   = 1,  kUChar_t  = 11, kShort_t    = 2,  kUShort_t = 12,
   kInt_t    = 3,  kUInt_t   = 13, kLong_t     = 4,  kULong_t  = 14,
   kFloat_t  = 5,  kDouble_t =  8, kDouble32_t = 9,  kchar     = 10,
   kBool_t   = 18, kLong64_t = 16, kULong64_t  = 17, kOther_t  = -1,
   kNoType_t = 0,  kFloat16_t= 19,
   kCounter  =  6, kCharStar = 7,  kBits     = 15 /* for compatibility with TStreamerInfo */,
   kVoid_t   = 20,

   kDataTypeAliasUnsigned_t = 21,
   kDataTypeAliasSignedChar_t = 22,
   // could add "long int" etc
   kNumDataTypes
};


class TDataType : public TDictionary {

private:
   TypedefInfo_t    *fInfo;     //!pointer to CINT typedef info
   Int_t             fSize;     //size of type
   EDataType         fType;     //type id
   Long_t            fProperty; //The property information for the (potential) underlying class
   TString           fTrueName; //Qualified name of the (potential) underlying class, e.g. "MyClass*const*"
   Int_t             fTypeNameIdx; //Start of class name part of the (potential) underlying class in fTrueName
   Int_t             fTypeNameLen; //Strlen of class name part of the (potential) underlying class in fTrueName
   static TDataType* fgBuiltins[kNumDataTypes]; //Array of builtins

   void CheckInfo();
   void SetType(const char *name);

protected:
   TDataType(const TDataType&);
   TDataType& operator=(const TDataType&);

public:
   TDataType(TypedefInfo_t *info = 0);
   TDataType(const char *typenam);
   virtual       ~TDataType();
   Int_t          Size() const;
   Int_t          GetType() const { return (Int_t)fType; }
   TString        GetTypeName();
   const char    *GetFullTypeName() const;
   const char    *AsString(void *buf) const;
   Long_t         Property() const;

   static const char *GetTypeName(EDataType type);
   static TDataType  *GetDataType(EDataType type);
   static EDataType GetType(const type_info &typeinfo);
   static void AddBuiltins(TCollection* types);

   ClassDef(TDataType,2)  //Basic data type descriptor
};

#endif
 TDataType.h:1
 TDataType.h:2
 TDataType.h:3
 TDataType.h:4
 TDataType.h:5
 TDataType.h:6
 TDataType.h:7
 TDataType.h:8
 TDataType.h:9
 TDataType.h:10
 TDataType.h:11
 TDataType.h:12
 TDataType.h:13
 TDataType.h:14
 TDataType.h:15
 TDataType.h:16
 TDataType.h:17
 TDataType.h:18
 TDataType.h:19
 TDataType.h:20
 TDataType.h:21
 TDataType.h:22
 TDataType.h:23
 TDataType.h:24
 TDataType.h:25
 TDataType.h:26
 TDataType.h:27
 TDataType.h:28
 TDataType.h:29
 TDataType.h:30
 TDataType.h:31
 TDataType.h:32
 TDataType.h:33
 TDataType.h:34
 TDataType.h:35
 TDataType.h:36
 TDataType.h:37
 TDataType.h:38
 TDataType.h:39
 TDataType.h:40
 TDataType.h:41
 TDataType.h:42
 TDataType.h:43
 TDataType.h:44
 TDataType.h:45
 TDataType.h:46
 TDataType.h:47
 TDataType.h:48
 TDataType.h:49
 TDataType.h:50
 TDataType.h:51
 TDataType.h:52
 TDataType.h:53
 TDataType.h:54
 TDataType.h:55
 TDataType.h:56
 TDataType.h:57
 TDataType.h:58
 TDataType.h:59
 TDataType.h:60
 TDataType.h:61
 TDataType.h:62
 TDataType.h:63
 TDataType.h:64
 TDataType.h:65
 TDataType.h:66
 TDataType.h:67
 TDataType.h:68
 TDataType.h:69
 TDataType.h:70
 TDataType.h:71
 TDataType.h:72
 TDataType.h:73
 TDataType.h:74
 TDataType.h:75
 TDataType.h:76
 TDataType.h:77
 TDataType.h:78
 TDataType.h:79
 TDataType.h:80
 TDataType.h:81
 TDataType.h:82
 TDataType.h:83
 TDataType.h:84