// @(#)root/meta:$Id$
// Author: Rene Brun   13/11/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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// Global variables class (global variables are obtained from CINT).    //
// This class describes the attributes of a global variable.            //
// The TROOT class contains a list of all currently defined global      //
// variables (accessible via TROOT::GetListOfGlobals()).                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGlobal.h"
#include "TInterpreter.h"
#include "TList.h"
#include "TROOT.h"


ClassImp(TGlobal)

//______________________________________________________________________________
TGlobal::TGlobal(DataMemberInfo_t *info) : TDictionary(), fInfo(info)
{
   // Default TGlobal ctor.

   if (fInfo) {
      SetName(gCling->DataMemberInfo_Name(fInfo));
      SetTitle(gCling->DataMemberInfo_Title(fInfo));
   }
}

//______________________________________________________________________________
TGlobal::TGlobal(const TGlobal &rhs) : TDictionary( ), fInfo(0)
{
   // Copy constructor
   
   if (rhs.fInfo) {
      fInfo = gCling->DataMemberInfo_FactoryCopy(rhs.fInfo);
      SetName(gCling->DataMemberInfo_Name(fInfo));
      SetTitle(gCling->DataMemberInfo_Title(fInfo));
   }
}

//______________________________________________________________________________
TGlobal &TGlobal::operator=(const TGlobal &rhs)
{
   // Assignment operator.
   
   if (this != &rhs) {
      gCling->DataMemberInfo_Delete(fInfo);
      if (rhs.fInfo) {
         fInfo = gCling->DataMemberInfo_FactoryCopy(rhs.fInfo);
         SetName(gCling->DataMemberInfo_Name(fInfo));
         SetTitle(gCling->DataMemberInfo_Title(fInfo));
      }
   }
   return *this;   
}

//______________________________________________________________________________
TGlobal::~TGlobal()
{
   // TGlobal dtor deletes adopted CINT DataMemberInfo object.

   gCling->DataMemberInfo_Delete(fInfo);
}

//______________________________________________________________________________
void *TGlobal::GetAddress() const
{
   // Return address of global.

   return (void *)gCling->DataMemberInfo_Offset(fInfo);
}

//______________________________________________________________________________
Int_t TGlobal::GetArrayDim() const
{
   // Return number of array dimensions.

   if (!fInfo) return 0;
   return gCling->DataMemberInfo_ArrayDim(fInfo);
}

//______________________________________________________________________________
TDictionary::DeclId_t TGlobal::GetDeclId() const
{
   return gInterpreter->GetDeclId(fInfo);
}

//______________________________________________________________________________
Int_t TGlobal::GetMaxIndex(Int_t dim) const
{
   // Return maximum index for array dimension "dim".

   if (!fInfo) return 0;
   return gCling->DataMemberInfo_MaxIndex(fInfo,dim);
}

//______________________________________________________________________________
const char *TGlobal::GetTypeName() const
{
   // Get type of global variable, e,g.: "class TDirectory*" -> "TDirectory".
   // Result needs to be used or copied immediately.

   if (!fInfo) return 0;
   return gCling->TypeName(gCling->DataMemberInfo_TypeName(fInfo));
}

//______________________________________________________________________________
const char *TGlobal::GetFullTypeName() const
{
   // Get full type description of global variable, e,g.: "class TDirectory*".

   if (!fInfo) return 0;
   return gCling->DataMemberInfo_TypeName(fInfo);
}

//______________________________________________________________________________
Bool_t TGlobal::IsValid()
{
   // Return true if this global object is pointing to a currently
   // loaded global.  If a global is unloaded after the TGlobal
   // is created, the TGlobal will be set to be invalid.

   // Register the transaction when checking the validity of the object.
   if (!fInfo && UpdateInterpreterStateMarker()) {
      DeclId_t newId = gInterpreter->GetDataMember(0, fName);
      if (newId) {
         DataMemberInfo_t *info = gInterpreter->DataMemberInfo_Factory(newId, 0);
         Update(info);
      }
      return newId != 0;
   }
   return fInfo != 0;
}

//______________________________________________________________________________
Long_t TGlobal::Property() const
{
   // Get property description word. For meaning of bits see EProperty.

   if (!fInfo) return 0;
   return gCling->DataMemberInfo_Property(fInfo);
}

//______________________________________________________________________________
Bool_t TGlobal::Update(DataMemberInfo_t *info)
{
   // Update the TFunction to reflect the new info.
   //
   // This can be used to implement unloading (info == 0) and then reloading
   // (info being the 'new' decl address).

   if (fInfo) gCling->DataMemberInfo_Delete(fInfo);
   fInfo = info;
   if (fInfo) {
      SetName(gCling->DataMemberInfo_Name(fInfo));
      SetTitle(gCling->DataMemberInfo_Title(fInfo));
   }
   return kTRUE;
}

TList& TGlobalMappedFunction::GetEarlyRegisteredGlobals()
{
   // Used to storeTGlobalMappedFunctions from other libs, before gROOT was inistialized
   static TList fEarlyRegisteredGlobals;
   return fEarlyRegisteredGlobals;
}

void TGlobalMappedFunction::Add(TGlobalMappedFunction* gmf)
{
   // Add to GetEarlyRegisteredGlobals() if gROOT is not yet initialized; add to
   // gROOT->GetListOfGlobals() otherwise.

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