//+SEQ,CopyRight,T=NOINCLUDE.

#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)            //
// TGlobalFunc                            (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_TObject
//*KEEP,TObject.
#include "TObject.h"
//*KEND.
#endif

#include "Property.h"

enum EProperty {
   kIsClass       = G__BIT_ISCLASS,
   kIsStruct      = G__BIT_ISSTRUCT,
   kIsUnion       = G__BIT_ISUNION,
   kIsEnum        = G__BIT_ISENUM,
   kIsTypedef     = G__BIT_ISTYPEDEF,
   kIsFundamental = G__BIT_ISFUNDAMENTAL,
   kIsAbstract    = G__BIT_ISABSTRACT,
   kIsVirtual     = G__BIT_ISVIRTUAL,
   kIsPureVirtual = G__BIT_ISPUREVIRTUAL,
   kIsPublic      = G__BIT_ISPUBLIC,
   kIsProtected   = G__BIT_ISPROTECTED,
   kIsPrivate     = G__BIT_ISPRIVATE,
   kIsPointer     = G__BIT_ISPOINTER,
   kIsArray       = G__BIT_ISARRAY,
   kIsStatic      = G__BIT_ISSTATIC,
   kIsDefault     = G__BIT_ISDEFAULT,
   kIsReference   = G__BIT_ISREFERENCE,
   kIsConstant    = G__BIT_ISCONSTANT
};


class TDictionary : public TObject {

public:
   TDictionary() { }
   virtual ~TDictionary() { }

   virtual const char *GetName() const = 0;
   virtual const char *GetTitle() const = 0;
   virtual Long_t      Property() const = 0;

   virtual ULong_t     Hash() = 0;
   virtual Bool_t      IsSortable() const { return kTRUE; }
   virtual Int_t       Compare(TObject *obj) = 0;

   ClassDef(TDictionary,0)  //ABC defining interface to dictionary
};

#endif