// @(#)root/cont
// Author: Philippe Canal Aug 2013

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfFunctions                                                     //
//                                                                      //
// A collection of TFunction objects designed for fast access given a   //
// DeclId_t and for keep track of TFunction that were described         //
// unloaded function.                                                   //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TListOfFunctions.h"
#include "TClass.h"
#include "TExMap.h"
#include "TFunction.h"
#include "TMethod.h"
#include "TInterpreter.h"
#include "TVirtualMutex.h"

ClassImp(TListOfFunctions)

//______________________________________________________________________________
TListOfFunctions::TListOfFunctions(TClass *cl) : fClass(cl),fIds(0),fUnloaded(0),fLastLoadMarker(0)
{
   // Constructor.

   fIds = new TExMap;
   fUnloaded = new THashList;
}

//______________________________________________________________________________
TListOfFunctions::~TListOfFunctions()
{
   // Destructor.

   THashList::Delete();
   delete fIds;
   fUnloaded->Delete();
   delete fUnloaded;
}

//______________________________________________________________________________
void TListOfFunctions::MapObject(TObject *obj)
{
   // Add pair<id, object> to the map of functions and their ids.

   TFunction *f = dynamic_cast<TFunction*>(obj);
   if (f) {
      fIds->Add((Long64_t)f->GetDeclId(),(Long64_t)f);
   }
}

//______________________________________________________________________________
void TListOfFunctions::AddFirst(TObject *obj)
{
   // Add object at the beginning of the list.

   THashList::AddFirst(obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddFirst(TObject *obj, Option_t *opt)
{
   // Add object at the beginning of the list and also store option.
   // Storing an option is useful when one wants to change the behaviour
   // of an object a little without having to create a complete new
   // copy of the object. This feature is used, for example, by the Draw()
   // method. It allows the same object to be drawn in different ways.

   THashList::AddFirst(obj,opt);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddLast(TObject *obj)
{
   // Add object at the end of the list.

   THashList::AddLast(obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddLast(TObject *obj, Option_t *opt)
{
   // Add object at the end of the list and also store option.
   // Storing an option is useful when one wants to change the behaviour
   // of an object a little without having to create a complete new
   // copy of the object. This feature is used, for example, by the Draw()
   // method. It allows the same object to be drawn in different ways.

   THashList::AddLast(obj, opt);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddAt(TObject *obj, Int_t idx)
{
   // Insert object at location idx in the list.

   THashList::AddAt(obj, idx);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddAfter(const TObject *after, TObject *obj)
{
   // Insert object after object after in the list.

   THashList::AddAfter(after, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddAfter(TObjLink *after, TObject *obj)
{
   // Insert object after object after in the list.

   THashList::AddAfter(after, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddBefore(const TObject *before, TObject *obj)
{
   // Insert object before object before in the list.

   THashList::AddBefore(before, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::AddBefore(TObjLink *before, TObject *obj)
{
   // Insert object before object before in the list.

   THashList::AddBefore(before, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfFunctions::Clear(Option_t *option)
{
   // Remove all objects from the list. Does not delete the objects unless
   // the THashList is the owner (set via SetOwner()).

   fUnloaded->Clear(option);
   fIds->Clear();
   THashList::Clear(option);
}

//______________________________________________________________________________
void TListOfFunctions::Delete(Option_t *option /* ="" */)
{
   // Delete all TFunction object files.

   fUnloaded->Delete(option);
   fIds->Clear();
   THashList::Delete(option);
}

//______________________________________________________________________________
TObject *TListOfFunctions::FindObject(const char *name) const
{
   // Specialize FindObject to do search for the
   // a function just by name or create it if its not already in the list

   R__LOCKGUARD(gInterpreterMutex);
   TObject *result = THashList::FindObject(name);
   if (!result) {

      TInterpreter::DeclId_t decl;
      if (fClass) decl = gInterpreter->GetFunction(fClass->GetClassInfo(),name);
      else        decl = gInterpreter->GetFunction(0,name);
      if (decl) result = const_cast<TListOfFunctions*>(this)->Get(decl);
   }
   return result;
}

//______________________________________________________________________________
TList* TListOfFunctions::GetListForObjectNonConst(const char* name)
{
   // Return the set of overloads for this name, collecting all available ones.
   // Can construct and insert new TFunction-s.

   R__LOCKGUARD(gInterpreterMutex);

   TList* overloads = (TList*)fOverloads.FindObject(name);
   TExMap overloadsSet;
   Bool_t wasEmpty = true;
   if (!overloads) {
      overloads = new TList();
      overloads->SetName(name);
      fOverloads.Add(overloads);
   } else {
      TIter iOverload(overloads);
      while (TFunction* over = (TFunction*)iOverload()) {
         wasEmpty = false;
         overloadsSet.Add((Long64_t)(ULong64_t)over->GetDeclId(),
                          (Long64_t)(ULong64_t)over);
      }
   }

   // Update if needed.
   std::vector<DeclId_t> overloadDecls;
   ClassInfo_t* ci = fClass ? fClass->GetClassInfo() : 0;
   gInterpreter->GetFunctionOverloads(ci, name, overloadDecls);
   for (std::vector<DeclId_t>::const_iterator iD = overloadDecls.begin(),
           eD = overloadDecls.end(); iD != eD; ++iD) {
      TFunction* over = Get(*iD);
      if (wasEmpty || !overloadsSet.GetValue((Long64_t)(ULong64_t)over->GetDeclId())) {
          overloads->Add(over);
      }
   }

   return overloads;
}

//______________________________________________________________________________
TList* TListOfFunctions::GetListForObject(const char* name) const
{
   // Return the set of overloads for this name, collecting all available ones.
   // Can construct and insert new TFunction-s.
   return const_cast<TListOfFunctions*>(this)->GetListForObjectNonConst(name);
}

//______________________________________________________________________________
TList* TListOfFunctions::GetListForObject(const TObject* obj) const
{
   // Return the set of overloads for function obj, collecting all available ones.
   // Can construct and insert new TFunction-s.
   if (!obj) return 0;
   return const_cast<TListOfFunctions*>(this)
      ->GetListForObjectNonConst(obj->GetName());
}

//______________________________________________________________________________
TFunction *TListOfFunctions::Find(DeclId_t id) const
{
   // Return the TMethod or TFunction describing the function corresponding
   // to the Decl 'id'. Return NULL if not found.

   if (!id) return 0;

   R__LOCKGUARD(gInterpreterMutex);
   return (TFunction*)fIds->GetValue((Long64_t)id);
}

//______________________________________________________________________________
TFunction *TListOfFunctions::Get(DeclId_t id)
{
   // Return (after creating it if necessary) the TMethod or TFunction
   // describing the function corresponding to the Decl 'id'.

   if (!id) return 0;

   TFunction *f = Find(id);
   if (f) return f;

   R__LOCKGUARD(gInterpreterMutex);
   if (fClass) {
      if (!gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id)) return 0;
   } else {
      if (!gInterpreter->ClassInfo_Contains(0,id)) return 0;
   }

   R__LOCKGUARD(gInterpreterMutex);

   MethodInfo_t *m = gInterpreter->MethodInfo_Factory(id);

   // Let's see if this is a reload ...
   const char *name = gInterpreter->MethodInfo_Name(m);
   if (TList* bucketForMethod = fUnloaded->GetListForObject(name)) {
      TString mangledName( gInterpreter->MethodInfo_GetMangledName(m) );
      TIter    next(bucketForMethod);
      TFunction *uf;
      while ((uf = (TFunction *) next())) {
         if (uf->GetMangledName() == mangledName) {
            // Reuse
            fUnloaded->Remove(uf);

            uf->Update(m);
            f = uf;
            break;
         }
      }
   }
   if (!f) {
      if (fClass) f = new TMethod(m, fClass);
      else f = new TFunction(m);
   }
   // Calling 'just' THahList::Add would turn around and call
   // TListOfFunctions::AddLast which should *also* do the fIds->Add.
   THashList::AddLast(f);
   fIds->Add((Long64_t)id,(Long64_t)f);

   return f;
}

//______________________________________________________________________________
void TListOfFunctions::UnmapObject(TObject *obj)
{
   // Remove a pair<id, object> from the map of functions and their ids.
   TFunction *f = dynamic_cast<TFunction*>(obj);
   if (f) {
      fIds->Remove((Long64_t)f->GetDeclId());
   }
}

//______________________________________________________________________________
void TListOfFunctions::RecursiveRemove(TObject *obj)
{
   // Remove object from this collection and recursively remove the object
   // from all other objects (and collections).
   // This function overrides TCollection::RecursiveRemove that calls
   // the Remove function. THashList::Remove cannot be called because
   // it uses the hash value of the hash table. This hash value
   // is not available anymore when RecursiveRemove is called from
   // the TObject destructor.

   if (!obj) return;

   THashList::RecursiveRemove(obj);
   fUnloaded->RecursiveRemove(obj);
   UnmapObject(obj);

}

//______________________________________________________________________________
TObject* TListOfFunctions::Remove(TObject *obj)
{
   // Remove object from the list.

   Bool_t found;

   found = THashList::Remove(obj);
   if (!found) {
      found = fUnloaded->Remove(obj);
   }
   UnmapObject(obj);
   if (found) return obj;
   else return 0;
}

//______________________________________________________________________________
TObject* TListOfFunctions::Remove(TObjLink *lnk)
{
   // Remove object via its objlink from the list.

   if (!lnk) return 0;

   TObject *obj = lnk->GetObject();

   THashList::Remove(lnk);
   fUnloaded->Remove(obj);

   UnmapObject(obj);
   return obj;
}

//______________________________________________________________________________
void TListOfFunctions::Load()
{
   // Load all the functions known to the intepreter for the scope 'fClass'
   // into this collection.

   if (fClass && fClass->GetClassInfo() == 0) return;

   R__LOCKGUARD(gInterpreterMutex);

   ULong64_t currentTransaction = gInterpreter->GetInterpreterStateMarker();
   if (currentTransaction == fLastLoadMarker) {
      return;
   }
   fLastLoadMarker = currentTransaction;

   ClassInfo_t *info;
   if (fClass) info = fClass->GetClassInfo();
   else info = gInterpreter->ClassInfo_Factory();

   MethodInfo_t *t = gInterpreter->MethodInfo_Factory(info);
   while (gInterpreter->MethodInfo_Next(t)) {
      if (gInterpreter->MethodInfo_IsValid(t)) {
         TDictionary::DeclId_t mid = gInterpreter->GetDeclId(t);
         // Get will check if there is already there or create a new one
         // (or re-use a previously unloaded version).
         Get(mid);
      }
   }
   gInterpreter->MethodInfo_Delete(t);
   if (!fClass) gInterpreter->ClassInfo_Delete(info);
}

//______________________________________________________________________________
void TListOfFunctions::Unload()
{
   // Mark 'all func' as being unloaded.
   // After the unload, the function can no longer be found directly,
   // until the decl can be found again in the interpreter (in which
   // the func object will be reused.

   TObjLink *lnk = FirstLink();
   while (lnk) {
      TFunction *func = (TFunction*)lnk->GetObject();

      fIds->Remove((Long64_t)func->GetDeclId());
      fUnloaded->Add(func);

      lnk = lnk->Next();
   }

   THashList::Clear();
}

//______________________________________________________________________________
void TListOfFunctions::Unload(TFunction *func)
{
   // Mark 'func' as being unloaded.
   // After the unload, the function can no longer be found directly,
   // until the decl can be found again in the interpreter (in which
   // the func object will be reused.

   if (THashList::Remove(func)) {
      // We contains the object, let remove it from the other internal
      // list and move it to the list of unloaded objects.

      fIds->Remove((Long64_t)func->GetDeclId());
      fUnloaded->Add(func);
   }
}

//______________________________________________________________________________
TObject* TListOfFunctions::FindObject(const TObject* obj) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::FindObject(obj);
}

//______________________________________________________________________________
TIterator* TListOfFunctions::MakeIterator(Bool_t dir ) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return new TListOfFunctionsIter(this,dir);
}

//______________________________________________________________________________
TObject* TListOfFunctions::At(Int_t idx) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::At(idx);
}

//______________________________________________________________________________
TObject* TListOfFunctions::After(const TObject *obj) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::After(obj);
}

//______________________________________________________________________________
TObject* TListOfFunctions::Before(const TObject *obj) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::Before(obj);
}

//______________________________________________________________________________
TObject* TListOfFunctions::First() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::First();
}

//______________________________________________________________________________
TObjLink* TListOfFunctions::FirstLink() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::FirstLink();
}

//______________________________________________________________________________
TObject** TListOfFunctions::GetObjectRef(const TObject *obj) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::GetObjectRef(obj);
}

//______________________________________________________________________________
TObject* TListOfFunctions::Last() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::Last();
}

//______________________________________________________________________________
TObjLink* TListOfFunctions::LastLink() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::LastLink();
}


//______________________________________________________________________________
Int_t TListOfFunctions::GetLast() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::GetLast();
}

//______________________________________________________________________________
Int_t TListOfFunctions::IndexOf(const TObject *obj) const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::IndexOf(obj);
}


//______________________________________________________________________________
Int_t TListOfFunctions::GetSize() const
{
   R__LOCKGUARD(gInterpreterMutex);
   return THashList::GetSize();
}

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfFunctionsIter                                                 //
//                                                                      //
// Iterator for TListOfFunctions.                                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TListOfFunctionsIter)

//______________________________________________________________________________
TListOfFunctionsIter::TListOfFunctionsIter(const TListOfFunctions *l, Bool_t dir ):
  TListIter(l,dir) {}

//______________________________________________________________________________
TObject *TListOfFunctionsIter::Next()
{
   R__LOCKGUARD(gInterpreterMutex);
   return TListIter::Next();
}

 TListOfFunctions.cxx:1
 TListOfFunctions.cxx:2
 TListOfFunctions.cxx:3
 TListOfFunctions.cxx:4
 TListOfFunctions.cxx:5
 TListOfFunctions.cxx:6
 TListOfFunctions.cxx:7
 TListOfFunctions.cxx:8
 TListOfFunctions.cxx:9
 TListOfFunctions.cxx:10
 TListOfFunctions.cxx:11
 TListOfFunctions.cxx:12
 TListOfFunctions.cxx:13
 TListOfFunctions.cxx:14
 TListOfFunctions.cxx:15
 TListOfFunctions.cxx:16
 TListOfFunctions.cxx:17
 TListOfFunctions.cxx:18
 TListOfFunctions.cxx:19
 TListOfFunctions.cxx:20
 TListOfFunctions.cxx:21
 TListOfFunctions.cxx:22
 TListOfFunctions.cxx:23
 TListOfFunctions.cxx:24
 TListOfFunctions.cxx:25
 TListOfFunctions.cxx:26
 TListOfFunctions.cxx:27
 TListOfFunctions.cxx:28
 TListOfFunctions.cxx:29
 TListOfFunctions.cxx:30
 TListOfFunctions.cxx:31
 TListOfFunctions.cxx:32
 TListOfFunctions.cxx:33
 TListOfFunctions.cxx:34
 TListOfFunctions.cxx:35
 TListOfFunctions.cxx:36
 TListOfFunctions.cxx:37
 TListOfFunctions.cxx:38
 TListOfFunctions.cxx:39
 TListOfFunctions.cxx:40
 TListOfFunctions.cxx:41
 TListOfFunctions.cxx:42
 TListOfFunctions.cxx:43
 TListOfFunctions.cxx:44
 TListOfFunctions.cxx:45
 TListOfFunctions.cxx:46
 TListOfFunctions.cxx:47
 TListOfFunctions.cxx:48
 TListOfFunctions.cxx:49
 TListOfFunctions.cxx:50
 TListOfFunctions.cxx:51
 TListOfFunctions.cxx:52
 TListOfFunctions.cxx:53
 TListOfFunctions.cxx:54
 TListOfFunctions.cxx:55
 TListOfFunctions.cxx:56
 TListOfFunctions.cxx:57
 TListOfFunctions.cxx:58
 TListOfFunctions.cxx:59
 TListOfFunctions.cxx:60
 TListOfFunctions.cxx:61
 TListOfFunctions.cxx:62
 TListOfFunctions.cxx:63
 TListOfFunctions.cxx:64
 TListOfFunctions.cxx:65
 TListOfFunctions.cxx:66
 TListOfFunctions.cxx:67
 TListOfFunctions.cxx:68
 TListOfFunctions.cxx:69
 TListOfFunctions.cxx:70
 TListOfFunctions.cxx:71
 TListOfFunctions.cxx:72
 TListOfFunctions.cxx:73
 TListOfFunctions.cxx:74
 TListOfFunctions.cxx:75
 TListOfFunctions.cxx:76
 TListOfFunctions.cxx:77
 TListOfFunctions.cxx:78
 TListOfFunctions.cxx:79
 TListOfFunctions.cxx:80
 TListOfFunctions.cxx:81
 TListOfFunctions.cxx:82
 TListOfFunctions.cxx:83
 TListOfFunctions.cxx:84
 TListOfFunctions.cxx:85
 TListOfFunctions.cxx:86
 TListOfFunctions.cxx:87
 TListOfFunctions.cxx:88
 TListOfFunctions.cxx:89
 TListOfFunctions.cxx:90
 TListOfFunctions.cxx:91
 TListOfFunctions.cxx:92
 TListOfFunctions.cxx:93
 TListOfFunctions.cxx:94
 TListOfFunctions.cxx:95
 TListOfFunctions.cxx:96
 TListOfFunctions.cxx:97
 TListOfFunctions.cxx:98
 TListOfFunctions.cxx:99
 TListOfFunctions.cxx:100
 TListOfFunctions.cxx:101
 TListOfFunctions.cxx:102
 TListOfFunctions.cxx:103
 TListOfFunctions.cxx:104
 TListOfFunctions.cxx:105
 TListOfFunctions.cxx:106
 TListOfFunctions.cxx:107
 TListOfFunctions.cxx:108
 TListOfFunctions.cxx:109
 TListOfFunctions.cxx:110
 TListOfFunctions.cxx:111
 TListOfFunctions.cxx:112
 TListOfFunctions.cxx:113
 TListOfFunctions.cxx:114
 TListOfFunctions.cxx:115
 TListOfFunctions.cxx:116
 TListOfFunctions.cxx:117
 TListOfFunctions.cxx:118
 TListOfFunctions.cxx:119
 TListOfFunctions.cxx:120
 TListOfFunctions.cxx:121
 TListOfFunctions.cxx:122
 TListOfFunctions.cxx:123
 TListOfFunctions.cxx:124
 TListOfFunctions.cxx:125
 TListOfFunctions.cxx:126
 TListOfFunctions.cxx:127
 TListOfFunctions.cxx:128
 TListOfFunctions.cxx:129
 TListOfFunctions.cxx:130
 TListOfFunctions.cxx:131
 TListOfFunctions.cxx:132
 TListOfFunctions.cxx:133
 TListOfFunctions.cxx:134
 TListOfFunctions.cxx:135
 TListOfFunctions.cxx:136
 TListOfFunctions.cxx:137
 TListOfFunctions.cxx:138
 TListOfFunctions.cxx:139
 TListOfFunctions.cxx:140
 TListOfFunctions.cxx:141
 TListOfFunctions.cxx:142
 TListOfFunctions.cxx:143
 TListOfFunctions.cxx:144
 TListOfFunctions.cxx:145
 TListOfFunctions.cxx:146
 TListOfFunctions.cxx:147
 TListOfFunctions.cxx:148
 TListOfFunctions.cxx:149
 TListOfFunctions.cxx:150
 TListOfFunctions.cxx:151
 TListOfFunctions.cxx:152
 TListOfFunctions.cxx:153
 TListOfFunctions.cxx:154
 TListOfFunctions.cxx:155
 TListOfFunctions.cxx:156
 TListOfFunctions.cxx:157
 TListOfFunctions.cxx:158
 TListOfFunctions.cxx:159
 TListOfFunctions.cxx:160
 TListOfFunctions.cxx:161
 TListOfFunctions.cxx:162
 TListOfFunctions.cxx:163
 TListOfFunctions.cxx:164
 TListOfFunctions.cxx:165
 TListOfFunctions.cxx:166
 TListOfFunctions.cxx:167
 TListOfFunctions.cxx:168
 TListOfFunctions.cxx:169
 TListOfFunctions.cxx:170
 TListOfFunctions.cxx:171
 TListOfFunctions.cxx:172
 TListOfFunctions.cxx:173
 TListOfFunctions.cxx:174
 TListOfFunctions.cxx:175
 TListOfFunctions.cxx:176
 TListOfFunctions.cxx:177
 TListOfFunctions.cxx:178
 TListOfFunctions.cxx:179
 TListOfFunctions.cxx:180
 TListOfFunctions.cxx:181
 TListOfFunctions.cxx:182
 TListOfFunctions.cxx:183
 TListOfFunctions.cxx:184
 TListOfFunctions.cxx:185
 TListOfFunctions.cxx:186
 TListOfFunctions.cxx:187
 TListOfFunctions.cxx:188
 TListOfFunctions.cxx:189
 TListOfFunctions.cxx:190
 TListOfFunctions.cxx:191
 TListOfFunctions.cxx:192
 TListOfFunctions.cxx:193
 TListOfFunctions.cxx:194
 TListOfFunctions.cxx:195
 TListOfFunctions.cxx:196
 TListOfFunctions.cxx:197
 TListOfFunctions.cxx:198
 TListOfFunctions.cxx:199
 TListOfFunctions.cxx:200
 TListOfFunctions.cxx:201
 TListOfFunctions.cxx:202
 TListOfFunctions.cxx:203
 TListOfFunctions.cxx:204
 TListOfFunctions.cxx:205
 TListOfFunctions.cxx:206
 TListOfFunctions.cxx:207
 TListOfFunctions.cxx:208
 TListOfFunctions.cxx:209
 TListOfFunctions.cxx:210
 TListOfFunctions.cxx:211
 TListOfFunctions.cxx:212
 TListOfFunctions.cxx:213
 TListOfFunctions.cxx:214
 TListOfFunctions.cxx:215
 TListOfFunctions.cxx:216
 TListOfFunctions.cxx:217
 TListOfFunctions.cxx:218
 TListOfFunctions.cxx:219
 TListOfFunctions.cxx:220
 TListOfFunctions.cxx:221
 TListOfFunctions.cxx:222
 TListOfFunctions.cxx:223
 TListOfFunctions.cxx:224
 TListOfFunctions.cxx:225
 TListOfFunctions.cxx:226
 TListOfFunctions.cxx:227
 TListOfFunctions.cxx:228
 TListOfFunctions.cxx:229
 TListOfFunctions.cxx:230
 TListOfFunctions.cxx:231
 TListOfFunctions.cxx:232
 TListOfFunctions.cxx:233
 TListOfFunctions.cxx:234
 TListOfFunctions.cxx:235
 TListOfFunctions.cxx:236
 TListOfFunctions.cxx:237
 TListOfFunctions.cxx:238
 TListOfFunctions.cxx:239
 TListOfFunctions.cxx:240
 TListOfFunctions.cxx:241
 TListOfFunctions.cxx:242
 TListOfFunctions.cxx:243
 TListOfFunctions.cxx:244
 TListOfFunctions.cxx:245
 TListOfFunctions.cxx:246
 TListOfFunctions.cxx:247
 TListOfFunctions.cxx:248
 TListOfFunctions.cxx:249
 TListOfFunctions.cxx:250
 TListOfFunctions.cxx:251
 TListOfFunctions.cxx:252
 TListOfFunctions.cxx:253
 TListOfFunctions.cxx:254
 TListOfFunctions.cxx:255
 TListOfFunctions.cxx:256
 TListOfFunctions.cxx:257
 TListOfFunctions.cxx:258
 TListOfFunctions.cxx:259
 TListOfFunctions.cxx:260
 TListOfFunctions.cxx:261
 TListOfFunctions.cxx:262
 TListOfFunctions.cxx:263
 TListOfFunctions.cxx:264
 TListOfFunctions.cxx:265
 TListOfFunctions.cxx:266
 TListOfFunctions.cxx:267
 TListOfFunctions.cxx:268
 TListOfFunctions.cxx:269
 TListOfFunctions.cxx:270
 TListOfFunctions.cxx:271
 TListOfFunctions.cxx:272
 TListOfFunctions.cxx:273
 TListOfFunctions.cxx:274
 TListOfFunctions.cxx:275
 TListOfFunctions.cxx:276
 TListOfFunctions.cxx:277
 TListOfFunctions.cxx:278
 TListOfFunctions.cxx:279
 TListOfFunctions.cxx:280
 TListOfFunctions.cxx:281
 TListOfFunctions.cxx:282
 TListOfFunctions.cxx:283
 TListOfFunctions.cxx:284
 TListOfFunctions.cxx:285
 TListOfFunctions.cxx:286
 TListOfFunctions.cxx:287
 TListOfFunctions.cxx:288
 TListOfFunctions.cxx:289
 TListOfFunctions.cxx:290
 TListOfFunctions.cxx:291
 TListOfFunctions.cxx:292
 TListOfFunctions.cxx:293
 TListOfFunctions.cxx:294
 TListOfFunctions.cxx:295
 TListOfFunctions.cxx:296
 TListOfFunctions.cxx:297
 TListOfFunctions.cxx:298
 TListOfFunctions.cxx:299
 TListOfFunctions.cxx:300
 TListOfFunctions.cxx:301
 TListOfFunctions.cxx:302
 TListOfFunctions.cxx:303
 TListOfFunctions.cxx:304
 TListOfFunctions.cxx:305
 TListOfFunctions.cxx:306
 TListOfFunctions.cxx:307
 TListOfFunctions.cxx:308
 TListOfFunctions.cxx:309
 TListOfFunctions.cxx:310
 TListOfFunctions.cxx:311
 TListOfFunctions.cxx:312
 TListOfFunctions.cxx:313
 TListOfFunctions.cxx:314
 TListOfFunctions.cxx:315
 TListOfFunctions.cxx:316
 TListOfFunctions.cxx:317
 TListOfFunctions.cxx:318
 TListOfFunctions.cxx:319
 TListOfFunctions.cxx:320
 TListOfFunctions.cxx:321
 TListOfFunctions.cxx:322
 TListOfFunctions.cxx:323
 TListOfFunctions.cxx:324
 TListOfFunctions.cxx:325
 TListOfFunctions.cxx:326
 TListOfFunctions.cxx:327
 TListOfFunctions.cxx:328
 TListOfFunctions.cxx:329
 TListOfFunctions.cxx:330
 TListOfFunctions.cxx:331
 TListOfFunctions.cxx:332
 TListOfFunctions.cxx:333
 TListOfFunctions.cxx:334
 TListOfFunctions.cxx:335
 TListOfFunctions.cxx:336
 TListOfFunctions.cxx:337
 TListOfFunctions.cxx:338
 TListOfFunctions.cxx:339
 TListOfFunctions.cxx:340
 TListOfFunctions.cxx:341
 TListOfFunctions.cxx:342
 TListOfFunctions.cxx:343
 TListOfFunctions.cxx:344
 TListOfFunctions.cxx:345
 TListOfFunctions.cxx:346
 TListOfFunctions.cxx:347
 TListOfFunctions.cxx:348
 TListOfFunctions.cxx:349
 TListOfFunctions.cxx:350
 TListOfFunctions.cxx:351
 TListOfFunctions.cxx:352
 TListOfFunctions.cxx:353
 TListOfFunctions.cxx:354
 TListOfFunctions.cxx:355
 TListOfFunctions.cxx:356
 TListOfFunctions.cxx:357
 TListOfFunctions.cxx:358
 TListOfFunctions.cxx:359
 TListOfFunctions.cxx:360
 TListOfFunctions.cxx:361
 TListOfFunctions.cxx:362
 TListOfFunctions.cxx:363
 TListOfFunctions.cxx:364
 TListOfFunctions.cxx:365
 TListOfFunctions.cxx:366
 TListOfFunctions.cxx:367
 TListOfFunctions.cxx:368
 TListOfFunctions.cxx:369
 TListOfFunctions.cxx:370
 TListOfFunctions.cxx:371
 TListOfFunctions.cxx:372
 TListOfFunctions.cxx:373
 TListOfFunctions.cxx:374
 TListOfFunctions.cxx:375
 TListOfFunctions.cxx:376
 TListOfFunctions.cxx:377
 TListOfFunctions.cxx:378
 TListOfFunctions.cxx:379
 TListOfFunctions.cxx:380
 TListOfFunctions.cxx:381
 TListOfFunctions.cxx:382
 TListOfFunctions.cxx:383
 TListOfFunctions.cxx:384
 TListOfFunctions.cxx:385
 TListOfFunctions.cxx:386
 TListOfFunctions.cxx:387
 TListOfFunctions.cxx:388
 TListOfFunctions.cxx:389
 TListOfFunctions.cxx:390
 TListOfFunctions.cxx:391
 TListOfFunctions.cxx:392
 TListOfFunctions.cxx:393
 TListOfFunctions.cxx:394
 TListOfFunctions.cxx:395
 TListOfFunctions.cxx:396
 TListOfFunctions.cxx:397
 TListOfFunctions.cxx:398
 TListOfFunctions.cxx:399
 TListOfFunctions.cxx:400
 TListOfFunctions.cxx:401
 TListOfFunctions.cxx:402
 TListOfFunctions.cxx:403
 TListOfFunctions.cxx:404
 TListOfFunctions.cxx:405
 TListOfFunctions.cxx:406
 TListOfFunctions.cxx:407
 TListOfFunctions.cxx:408
 TListOfFunctions.cxx:409
 TListOfFunctions.cxx:410
 TListOfFunctions.cxx:411
 TListOfFunctions.cxx:412
 TListOfFunctions.cxx:413
 TListOfFunctions.cxx:414
 TListOfFunctions.cxx:415
 TListOfFunctions.cxx:416
 TListOfFunctions.cxx:417
 TListOfFunctions.cxx:418
 TListOfFunctions.cxx:419
 TListOfFunctions.cxx:420
 TListOfFunctions.cxx:421
 TListOfFunctions.cxx:422
 TListOfFunctions.cxx:423
 TListOfFunctions.cxx:424
 TListOfFunctions.cxx:425
 TListOfFunctions.cxx:426
 TListOfFunctions.cxx:427
 TListOfFunctions.cxx:428
 TListOfFunctions.cxx:429
 TListOfFunctions.cxx:430
 TListOfFunctions.cxx:431
 TListOfFunctions.cxx:432
 TListOfFunctions.cxx:433
 TListOfFunctions.cxx:434
 TListOfFunctions.cxx:435
 TListOfFunctions.cxx:436
 TListOfFunctions.cxx:437
 TListOfFunctions.cxx:438
 TListOfFunctions.cxx:439
 TListOfFunctions.cxx:440
 TListOfFunctions.cxx:441
 TListOfFunctions.cxx:442
 TListOfFunctions.cxx:443
 TListOfFunctions.cxx:444
 TListOfFunctions.cxx:445
 TListOfFunctions.cxx:446
 TListOfFunctions.cxx:447
 TListOfFunctions.cxx:448
 TListOfFunctions.cxx:449
 TListOfFunctions.cxx:450
 TListOfFunctions.cxx:451
 TListOfFunctions.cxx:452
 TListOfFunctions.cxx:453
 TListOfFunctions.cxx:454
 TListOfFunctions.cxx:455
 TListOfFunctions.cxx:456
 TListOfFunctions.cxx:457
 TListOfFunctions.cxx:458
 TListOfFunctions.cxx:459
 TListOfFunctions.cxx:460
 TListOfFunctions.cxx:461
 TListOfFunctions.cxx:462
 TListOfFunctions.cxx:463
 TListOfFunctions.cxx:464
 TListOfFunctions.cxx:465
 TListOfFunctions.cxx:466
 TListOfFunctions.cxx:467
 TListOfFunctions.cxx:468
 TListOfFunctions.cxx:469
 TListOfFunctions.cxx:470
 TListOfFunctions.cxx:471
 TListOfFunctions.cxx:472
 TListOfFunctions.cxx:473
 TListOfFunctions.cxx:474
 TListOfFunctions.cxx:475
 TListOfFunctions.cxx:476
 TListOfFunctions.cxx:477
 TListOfFunctions.cxx:478
 TListOfFunctions.cxx:479
 TListOfFunctions.cxx:480
 TListOfFunctions.cxx:481
 TListOfFunctions.cxx:482
 TListOfFunctions.cxx:483
 TListOfFunctions.cxx:484
 TListOfFunctions.cxx:485
 TListOfFunctions.cxx:486
 TListOfFunctions.cxx:487
 TListOfFunctions.cxx:488
 TListOfFunctions.cxx:489
 TListOfFunctions.cxx:490
 TListOfFunctions.cxx:491
 TListOfFunctions.cxx:492
 TListOfFunctions.cxx:493
 TListOfFunctions.cxx:494
 TListOfFunctions.cxx:495
 TListOfFunctions.cxx:496
 TListOfFunctions.cxx:497
 TListOfFunctions.cxx:498
 TListOfFunctions.cxx:499
 TListOfFunctions.cxx:500
 TListOfFunctions.cxx:501
 TListOfFunctions.cxx:502
 TListOfFunctions.cxx:503
 TListOfFunctions.cxx:504
 TListOfFunctions.cxx:505
 TListOfFunctions.cxx:506
 TListOfFunctions.cxx:507
 TListOfFunctions.cxx:508
 TListOfFunctions.cxx:509
 TListOfFunctions.cxx:510
 TListOfFunctions.cxx:511
 TListOfFunctions.cxx:512
 TListOfFunctions.cxx:513
 TListOfFunctions.cxx:514
 TListOfFunctions.cxx:515
 TListOfFunctions.cxx:516
 TListOfFunctions.cxx:517
 TListOfFunctions.cxx:518
 TListOfFunctions.cxx:519
 TListOfFunctions.cxx:520
 TListOfFunctions.cxx:521
 TListOfFunctions.cxx:522
 TListOfFunctions.cxx:523
 TListOfFunctions.cxx:524
 TListOfFunctions.cxx:525
 TListOfFunctions.cxx:526
 TListOfFunctions.cxx:527
 TListOfFunctions.cxx:528
 TListOfFunctions.cxx:529
 TListOfFunctions.cxx:530
 TListOfFunctions.cxx:531
 TListOfFunctions.cxx:532
 TListOfFunctions.cxx:533
 TListOfFunctions.cxx:534
 TListOfFunctions.cxx:535
 TListOfFunctions.cxx:536
 TListOfFunctions.cxx:537
 TListOfFunctions.cxx:538
 TListOfFunctions.cxx:539
 TListOfFunctions.cxx:540
 TListOfFunctions.cxx:541
 TListOfFunctions.cxx:542
 TListOfFunctions.cxx:543
 TListOfFunctions.cxx:544
 TListOfFunctions.cxx:545
 TListOfFunctions.cxx:546
 TListOfFunctions.cxx:547
 TListOfFunctions.cxx:548
 TListOfFunctions.cxx:549
 TListOfFunctions.cxx:550
 TListOfFunctions.cxx:551
 TListOfFunctions.cxx:552
 TListOfFunctions.cxx:553
 TListOfFunctions.cxx:554
 TListOfFunctions.cxx:555
 TListOfFunctions.cxx:556