// @(#)root/meta:$Id$
// Author: Fons Rademakers   20/06/96

/*************************************************************************
 * 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_TDictionary
#define ROOT_TDictionary

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDictionary                                                          //
//                                                                      //
// This class defines an abstract interface that must be implemented    //
// by all classes that contain dictionary information.                  //
//                                                                      //
// The dictionary is defined by the followling classes:                 //
// TDataType                              (typedef definitions)         //
// TGlobal                                (global variables)            //
// TFunction                              (global functions)            //
// TClass                                 (classes)                     //
//    TBaseClass                          (base classes)                //
//    TDataMember                         (class datamembers)           //
//    TMethod                             (class methods)               //
//       TMethodArg                       (method arguments)            //
//                                                                      //
// All the above classes implement the TDictionary abstract interface   //
// (note: the indentation shows aggregation not inheritance).           //
// The ROOT dictionary system provides a very extensive RTTI            //
// environment that facilitates a.o. object inspectors, object I/O,     //
// ROOT Trees, etc. Most of the type information is provided by the     //
// CINT C++ interpreter.                                                //
//                                                                      //
// TMethodCall                            (method call environment)     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

#ifndef ROOT_ESTLType
#include "ESTLType.h"
#endif

// The following are opaque type and are never really declared
// The specific implemenation of TInterpreter will cast the
// value of pointer to this types to the correct type (possibly
// distinct from these)
class CallFunc_t;
class ClassInfo_t;
class BaseClassInfo_t;
class DataMemberInfo_t;
class FuncTempInfo_t;
class MethodInfo_t;
class MethodArgInfo_t;
class MethodArgInfo_t;
class TypeInfo_t;
class TypedefInfo_t;
class TDictAttributeMap;

enum EProperty {
   kIsClass         = 0x00000001,
   kIsStruct        = 0x00000002,
   kIsUnion         = 0x00000004,
   kIsEnum          = 0x00000008,
   kIsTypedef       = 0x00000010,
   kIsFundamental   = 0x00000020,
   kIsAbstract      = 0x00000040,
   kIsVirtual       = 0x00000080,
   kIsPureVirtual   = 0x00000100,
   kIsPublic        = 0x00000200,
   kIsProtected     = 0x00000400,
   kIsPrivate       = 0x00000800,
   kIsPointer       = 0x00001000,
   kIsArray         = 0x00002000,
   kIsStatic        = 0x00004000,
   kIsDefault       = 0x00008000,
   kIsReference     = 0x00010000,
   kIsDirectInherit = 0x00020000,
   kIsCCompiled     = 0x00040000,
   kIsCPPCompiled   = 0x00080000,
   kIsCompiled      = 0x000C0000,
   kIsConstant      = 0x00100000,
   kIsVirtualBase   = 0x00200000,
   kIsConstPointer  = 0x00400000,
   kIsExplicit      = 0x04000000,
   kIsNamespace     = 0x08000000,
   kIsConstMethod   = 0x10000000,
   kIsUsingVariable = 0x20000000,
   kIsDefinedInStd  = 0x40000000
};

enum EFunctionProperty {
/* The following are already defined
   in EProperty and 'could' be part of this enums */
/*
   kIsAbstract      = 0x00000040,
   kIsVirtual       = 0x00000080,
   kIsPureVirtual   = 0x00000100,
   kIsPublic        = 0x00000200,
   kIsProtected     = 0x00000400,
   kIsPrivate       = 0x00000800,
   kIsStatic        = 0x00004000,
   kIsDefault       = 0x00008000,
   kIsExplicit      = 0x04000000,
   kIsConstMethod   = 0x10000000,
*/
/* The following are already defined
   in EProperty and related to the type of the return value */
/*
 kIsConstant      = 0x00100000,
 kIsPointer       = 0x00001000,
 kIsArray         = 0x00002000,
 kIsReference     = 0x00010000,
 kIsConstPointer  = 0x00400000,
*/
   kIsConstructor = 0x00000001,
   kIsConversion  = 0x00000002,
   kIsDestructor  = 0x00000004,
   kIsOperator    = 0x00000008
};

enum EClassProperty {
   kClassIsValid         = 0x00000001,
   kClassHasExplicitCtor = 0x00000010,
   kClassHasImplicitCtor = 0x00000020,
   kClassHasCtor         = 0x00000030,
   kClassHasDefaultCtor  = 0x00000040,
   kClassHasAssignOpr    = 0x00000080,
   kClassHasExplicitDtor = 0x00000100,
   kClassHasImplicitDtor = 0x00000200,
   kClassHasDtor         = 0x00000300,
   kClassHasVirtual      = 0x00001000,
   kClassIsAbstract      = 0x00002000
};

enum ERefTypeValues {
   kParaNormal     = 0,     // not used
   kParaReference  = 1,
   kParaP2P        = 2,     // not used
   kParaP2P2P      = 3,     // not used
   kParaRef        = 100,
   kParaRefP2P     = 102,   // not used
   kParaRefP2P2P   = 103    // not used
};

namespace ROOT {
   enum EFunctionMatchMode {
      kExactMatch = 0,
      kConversionMatch = 1
   };
}


class TDictionary : public TNamed {

private:
   TDictAttributeMap *fAttributeMap;    //pointer to a class attribute map
   ULong64_t fUpdatingTransactionCount; //!the Cling ID of the transaction that last updated the object

protected:
   Bool_t              UpdateInterpreterStateMarker();

public:
   TDictionary(): fAttributeMap(0), fUpdatingTransactionCount(0) { }
   TDictionary(const char* name): TNamed(name, ""), fAttributeMap(0), fUpdatingTransactionCount(0) { }
   TDictionary(const TDictionary& dict);
   virtual ~TDictionary();

   TDictionary& operator=(const TDictionary& other);

   void                CreateAttributeMap();
   TDictAttributeMap  *GetAttributeMap() const
   {
      //Get the TDictAttributeMap pointer to be able to add attribute
      //pairs key-value to the TClass.

      return fAttributeMap;
   }
   virtual Long_t      Property() const = 0;
   static TDictionary* GetDictionary(const char* name);
   static TDictionary* GetDictionary(const type_info &typeinfo);

   // Type of STL container (returned by IsSTLContainer).
   enum ESTLType {
      kNone      = ROOT::kNotSTL,
      kVector    = ROOT::kSTLvector,
      kList      = ROOT::kSTLlist,
      kDeque     = ROOT::kSTLdeque,
      kMap       = ROOT::kSTLmap,
      kMultimap  = ROOT::kSTLmultimap,
      kSet       = ROOT::kSTLset,
      kMultiset  = ROOT::kSTLmultiset,
      kBitset    = ROOT::kSTLbitset
   };

   typedef const void *DeclId_t;
   ClassDef(TDictionary,2)  //Interface to dictionary
};

#endif
 TDictionary.h:1
 TDictionary.h:2
 TDictionary.h:3
 TDictionary.h:4
 TDictionary.h:5
 TDictionary.h:6
 TDictionary.h:7
 TDictionary.h:8
 TDictionary.h:9
 TDictionary.h:10
 TDictionary.h:11
 TDictionary.h:12
 TDictionary.h:13
 TDictionary.h:14
 TDictionary.h:15
 TDictionary.h:16
 TDictionary.h:17
 TDictionary.h:18
 TDictionary.h:19
 TDictionary.h:20
 TDictionary.h:21
 TDictionary.h:22
 TDictionary.h:23
 TDictionary.h:24
 TDictionary.h:25
 TDictionary.h:26
 TDictionary.h:27
 TDictionary.h:28
 TDictionary.h:29
 TDictionary.h:30
 TDictionary.h:31
 TDictionary.h:32
 TDictionary.h:33
 TDictionary.h:34
 TDictionary.h:35
 TDictionary.h:36
 TDictionary.h:37
 TDictionary.h:38
 TDictionary.h:39
 TDictionary.h:40
 TDictionary.h:41
 TDictionary.h:42
 TDictionary.h:43
 TDictionary.h:44
 TDictionary.h:45
 TDictionary.h:46
 TDictionary.h:47
 TDictionary.h:48
 TDictionary.h:49
 TDictionary.h:50
 TDictionary.h:51
 TDictionary.h:52
 TDictionary.h:53
 TDictionary.h:54
 TDictionary.h:55
 TDictionary.h:56
 TDictionary.h:57
 TDictionary.h:58
 TDictionary.h:59
 TDictionary.h:60
 TDictionary.h:61
 TDictionary.h:62
 TDictionary.h:63
 TDictionary.h:64
 TDictionary.h:65
 TDictionary.h:66
 TDictionary.h:67
 TDictionary.h:68
 TDictionary.h:69
 TDictionary.h:70
 TDictionary.h:71
 TDictionary.h:72
 TDictionary.h:73
 TDictionary.h:74
 TDictionary.h:75
 TDictionary.h:76
 TDictionary.h:77
 TDictionary.h:78
 TDictionary.h:79
 TDictionary.h:80
 TDictionary.h:81
 TDictionary.h:82
 TDictionary.h:83
 TDictionary.h:84
 TDictionary.h:85
 TDictionary.h:86
 TDictionary.h:87
 TDictionary.h:88
 TDictionary.h:89
 TDictionary.h:90
 TDictionary.h:91
 TDictionary.h:92
 TDictionary.h:93
 TDictionary.h:94
 TDictionary.h:95
 TDictionary.h:96
 TDictionary.h:97
 TDictionary.h:98
 TDictionary.h:99
 TDictionary.h:100
 TDictionary.h:101
 TDictionary.h:102
 TDictionary.h:103
 TDictionary.h:104
 TDictionary.h:105
 TDictionary.h:106
 TDictionary.h:107
 TDictionary.h:108
 TDictionary.h:109
 TDictionary.h:110
 TDictionary.h:111
 TDictionary.h:112
 TDictionary.h:113
 TDictionary.h:114
 TDictionary.h:115
 TDictionary.h:116
 TDictionary.h:117
 TDictionary.h:118
 TDictionary.h:119
 TDictionary.h:120
 TDictionary.h:121
 TDictionary.h:122
 TDictionary.h:123
 TDictionary.h:124
 TDictionary.h:125
 TDictionary.h:126
 TDictionary.h:127
 TDictionary.h:128
 TDictionary.h:129
 TDictionary.h:130
 TDictionary.h:131
 TDictionary.h:132
 TDictionary.h:133
 TDictionary.h:134
 TDictionary.h:135
 TDictionary.h:136
 TDictionary.h:137
 TDictionary.h:138
 TDictionary.h:139
 TDictionary.h:140
 TDictionary.h:141
 TDictionary.h:142
 TDictionary.h:143
 TDictionary.h:144
 TDictionary.h:145
 TDictionary.h:146
 TDictionary.h:147
 TDictionary.h:148
 TDictionary.h:149
 TDictionary.h:150
 TDictionary.h:151
 TDictionary.h:152
 TDictionary.h:153
 TDictionary.h:154
 TDictionary.h:155
 TDictionary.h:156
 TDictionary.h:157
 TDictionary.h:158
 TDictionary.h:159
 TDictionary.h:160
 TDictionary.h:161
 TDictionary.h:162
 TDictionary.h:163
 TDictionary.h:164
 TDictionary.h:165
 TDictionary.h:166
 TDictionary.h:167
 TDictionary.h:168
 TDictionary.h:169
 TDictionary.h:170
 TDictionary.h:171
 TDictionary.h:172
 TDictionary.h:173
 TDictionary.h:174
 TDictionary.h:175
 TDictionary.h:176
 TDictionary.h:177
 TDictionary.h:178
 TDictionary.h:179
 TDictionary.h:180
 TDictionary.h:181
 TDictionary.h:182
 TDictionary.h:183
 TDictionary.h:184
 TDictionary.h:185
 TDictionary.h:186
 TDictionary.h:187
 TDictionary.h:188
 TDictionary.h:189
 TDictionary.h:190
 TDictionary.h:191
 TDictionary.h:192
 TDictionary.h:193
 TDictionary.h:194
 TDictionary.h:195
 TDictionary.h:196
 TDictionary.h:197
 TDictionary.h:198
 TDictionary.h:199
 TDictionary.h:200
 TDictionary.h:201
 TDictionary.h:202
 TDictionary.h:203
 TDictionary.h:204
 TDictionary.h:205
 TDictionary.h:206
 TDictionary.h:207
 TDictionary.h:208