// @(#)root/cont
// Author: Bianca-Cristina Cristescu March 2014

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfFunctionTemplates                                                     //
//                                                                      //
// 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 "TListOfFunctionTemplates.h"
#include "TClass.h"
#include "TExMap.h"
#include "TFunction.h"
#include "TFunctionTemplate.h"
#include "TMethod.h"
#include "TInterpreter.h"
#include "TVirtualMutex.h"

ClassImp(TListOfFunctionTemplates)

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

   fIds = new TExMap;
   fUnloaded = new THashList;
}

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

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

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

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

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

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

//______________________________________________________________________________
void TListOfFunctionTemplates::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 TListOfFunctionTemplates::AddLast(TObject *obj)
{
   // Add object at the end of the list.

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

//______________________________________________________________________________
void TListOfFunctionTemplates::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 TListOfFunctionTemplates::AddAt(TObject *obj, Int_t idx)
{
   // Insert object at location idx in the list.

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

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

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

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

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

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

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

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

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

//______________________________________________________________________________
void TListOfFunctionTemplates::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 TListOfFunctionTemplates::Delete(Option_t *option /* ="" */)
{
   // Delete all TFunction object files.

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

//______________________________________________________________________________
TObject *TListOfFunctionTemplates::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

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

      R__LOCKGUARD(gInterpreterMutex);

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

//______________________________________________________________________________
TList* TListOfFunctionTemplates::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 (TFunctionTemplate* over = (TFunctionTemplate*)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) {
      TFunctionTemplate* over = Get(*iD);
      if (wasEmpty || !overloadsSet.GetValue((Long64_t)(ULong64_t)over->GetDeclId())) {
          overloads->Add(over);
      }
   }

   return overloads;
}

//______________________________________________________________________________
TList* TListOfFunctionTemplates::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<TListOfFunctionTemplates*>(this)->GetListForObjectNonConst(name);
}

//______________________________________________________________________________
TList* TListOfFunctionTemplates::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<TListOfFunctionTemplates*>(this)
      ->GetListForObjectNonConst(obj->GetName());
}

//______________________________________________________________________________
TFunctionTemplate *TListOfFunctionTemplates::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;

   TFunctionTemplate *f = (TFunctionTemplate*)fIds->GetValue((Long64_t)id);
   if (!f) {
      if (fClass) {
         if (!gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id)) return 0;
      } else {
         if (!gInterpreter->ClassInfo_Contains(0,id)) return 0;
      }

      R__LOCKGUARD(gInterpreterMutex);

      FuncTempInfo_t *m = gInterpreter->FuncTempInfo_Factory(id);

      // Let's see if this is a reload ...
      TString name;
      gInterpreter->FuncTempInfo_Name(m, name);
      TFunctionTemplate* update = (TFunctionTemplate*)fUnloaded->FindObject(name);
      if (update) {
         fUnloaded->Remove(update);
         update->Update(m);
         f = update;
      }
      if (!f) {
         if (fClass) f = new TFunctionTemplate(m, fClass);
         else f = new TFunctionTemplate(m, 0);
      }
      // Calling 'just' THahList::Add would turn around and call
      // TListOfFunctionTemplates::AddLast which should *also* do the fIds->Add.
      THashList::AddLast(f);
      fIds->Add((Long64_t)id,(Long64_t)f);
   }
   return f;
}

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

//______________________________________________________________________________
void TListOfFunctionTemplates::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* TListOfFunctionTemplates::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* TListOfFunctionTemplates::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 TListOfFunctionTemplates::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;

   gInterpreter->LoadFunctionTemplates(fClass);
}

//______________________________________________________________________________
void TListOfFunctionTemplates::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) {
      TFunctionTemplate *func = (TFunctionTemplate*)lnk->GetObject();

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

      lnk = lnk->Next();
   }

   THashList::Clear();
}

//______________________________________________________________________________
void TListOfFunctionTemplates::Unload(TFunctionTemplate *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);
   }
}
 TListOfFunctionTemplates.cxx:1
 TListOfFunctionTemplates.cxx:2
 TListOfFunctionTemplates.cxx:3
 TListOfFunctionTemplates.cxx:4
 TListOfFunctionTemplates.cxx:5
 TListOfFunctionTemplates.cxx:6
 TListOfFunctionTemplates.cxx:7
 TListOfFunctionTemplates.cxx:8
 TListOfFunctionTemplates.cxx:9
 TListOfFunctionTemplates.cxx:10
 TListOfFunctionTemplates.cxx:11
 TListOfFunctionTemplates.cxx:12
 TListOfFunctionTemplates.cxx:13
 TListOfFunctionTemplates.cxx:14
 TListOfFunctionTemplates.cxx:15
 TListOfFunctionTemplates.cxx:16
 TListOfFunctionTemplates.cxx:17
 TListOfFunctionTemplates.cxx:18
 TListOfFunctionTemplates.cxx:19
 TListOfFunctionTemplates.cxx:20
 TListOfFunctionTemplates.cxx:21
 TListOfFunctionTemplates.cxx:22
 TListOfFunctionTemplates.cxx:23
 TListOfFunctionTemplates.cxx:24
 TListOfFunctionTemplates.cxx:25
 TListOfFunctionTemplates.cxx:26
 TListOfFunctionTemplates.cxx:27
 TListOfFunctionTemplates.cxx:28
 TListOfFunctionTemplates.cxx:29
 TListOfFunctionTemplates.cxx:30
 TListOfFunctionTemplates.cxx:31
 TListOfFunctionTemplates.cxx:32
 TListOfFunctionTemplates.cxx:33
 TListOfFunctionTemplates.cxx:34
 TListOfFunctionTemplates.cxx:35
 TListOfFunctionTemplates.cxx:36
 TListOfFunctionTemplates.cxx:37
 TListOfFunctionTemplates.cxx:38
 TListOfFunctionTemplates.cxx:39
 TListOfFunctionTemplates.cxx:40
 TListOfFunctionTemplates.cxx:41
 TListOfFunctionTemplates.cxx:42
 TListOfFunctionTemplates.cxx:43
 TListOfFunctionTemplates.cxx:44
 TListOfFunctionTemplates.cxx:45
 TListOfFunctionTemplates.cxx:46
 TListOfFunctionTemplates.cxx:47
 TListOfFunctionTemplates.cxx:48
 TListOfFunctionTemplates.cxx:49
 TListOfFunctionTemplates.cxx:50
 TListOfFunctionTemplates.cxx:51
 TListOfFunctionTemplates.cxx:52
 TListOfFunctionTemplates.cxx:53
 TListOfFunctionTemplates.cxx:54
 TListOfFunctionTemplates.cxx:55
 TListOfFunctionTemplates.cxx:56
 TListOfFunctionTemplates.cxx:57
 TListOfFunctionTemplates.cxx:58
 TListOfFunctionTemplates.cxx:59
 TListOfFunctionTemplates.cxx:60
 TListOfFunctionTemplates.cxx:61
 TListOfFunctionTemplates.cxx:62
 TListOfFunctionTemplates.cxx:63
 TListOfFunctionTemplates.cxx:64
 TListOfFunctionTemplates.cxx:65
 TListOfFunctionTemplates.cxx:66
 TListOfFunctionTemplates.cxx:67
 TListOfFunctionTemplates.cxx:68
 TListOfFunctionTemplates.cxx:69
 TListOfFunctionTemplates.cxx:70
 TListOfFunctionTemplates.cxx:71
 TListOfFunctionTemplates.cxx:72
 TListOfFunctionTemplates.cxx:73
 TListOfFunctionTemplates.cxx:74
 TListOfFunctionTemplates.cxx:75
 TListOfFunctionTemplates.cxx:76
 TListOfFunctionTemplates.cxx:77
 TListOfFunctionTemplates.cxx:78
 TListOfFunctionTemplates.cxx:79
 TListOfFunctionTemplates.cxx:80
 TListOfFunctionTemplates.cxx:81
 TListOfFunctionTemplates.cxx:82
 TListOfFunctionTemplates.cxx:83
 TListOfFunctionTemplates.cxx:84
 TListOfFunctionTemplates.cxx:85
 TListOfFunctionTemplates.cxx:86
 TListOfFunctionTemplates.cxx:87
 TListOfFunctionTemplates.cxx:88
 TListOfFunctionTemplates.cxx:89
 TListOfFunctionTemplates.cxx:90
 TListOfFunctionTemplates.cxx:91
 TListOfFunctionTemplates.cxx:92
 TListOfFunctionTemplates.cxx:93
 TListOfFunctionTemplates.cxx:94
 TListOfFunctionTemplates.cxx:95
 TListOfFunctionTemplates.cxx:96
 TListOfFunctionTemplates.cxx:97
 TListOfFunctionTemplates.cxx:98
 TListOfFunctionTemplates.cxx:99
 TListOfFunctionTemplates.cxx:100
 TListOfFunctionTemplates.cxx:101
 TListOfFunctionTemplates.cxx:102
 TListOfFunctionTemplates.cxx:103
 TListOfFunctionTemplates.cxx:104
 TListOfFunctionTemplates.cxx:105
 TListOfFunctionTemplates.cxx:106
 TListOfFunctionTemplates.cxx:107
 TListOfFunctionTemplates.cxx:108
 TListOfFunctionTemplates.cxx:109
 TListOfFunctionTemplates.cxx:110
 TListOfFunctionTemplates.cxx:111
 TListOfFunctionTemplates.cxx:112
 TListOfFunctionTemplates.cxx:113
 TListOfFunctionTemplates.cxx:114
 TListOfFunctionTemplates.cxx:115
 TListOfFunctionTemplates.cxx:116
 TListOfFunctionTemplates.cxx:117
 TListOfFunctionTemplates.cxx:118
 TListOfFunctionTemplates.cxx:119
 TListOfFunctionTemplates.cxx:120
 TListOfFunctionTemplates.cxx:121
 TListOfFunctionTemplates.cxx:122
 TListOfFunctionTemplates.cxx:123
 TListOfFunctionTemplates.cxx:124
 TListOfFunctionTemplates.cxx:125
 TListOfFunctionTemplates.cxx:126
 TListOfFunctionTemplates.cxx:127
 TListOfFunctionTemplates.cxx:128
 TListOfFunctionTemplates.cxx:129
 TListOfFunctionTemplates.cxx:130
 TListOfFunctionTemplates.cxx:131
 TListOfFunctionTemplates.cxx:132
 TListOfFunctionTemplates.cxx:133
 TListOfFunctionTemplates.cxx:134
 TListOfFunctionTemplates.cxx:135
 TListOfFunctionTemplates.cxx:136
 TListOfFunctionTemplates.cxx:137
 TListOfFunctionTemplates.cxx:138
 TListOfFunctionTemplates.cxx:139
 TListOfFunctionTemplates.cxx:140
 TListOfFunctionTemplates.cxx:141
 TListOfFunctionTemplates.cxx:142
 TListOfFunctionTemplates.cxx:143
 TListOfFunctionTemplates.cxx:144
 TListOfFunctionTemplates.cxx:145
 TListOfFunctionTemplates.cxx:146
 TListOfFunctionTemplates.cxx:147
 TListOfFunctionTemplates.cxx:148
 TListOfFunctionTemplates.cxx:149
 TListOfFunctionTemplates.cxx:150
 TListOfFunctionTemplates.cxx:151
 TListOfFunctionTemplates.cxx:152
 TListOfFunctionTemplates.cxx:153
 TListOfFunctionTemplates.cxx:154
 TListOfFunctionTemplates.cxx:155
 TListOfFunctionTemplates.cxx:156
 TListOfFunctionTemplates.cxx:157
 TListOfFunctionTemplates.cxx:158
 TListOfFunctionTemplates.cxx:159
 TListOfFunctionTemplates.cxx:160
 TListOfFunctionTemplates.cxx:161
 TListOfFunctionTemplates.cxx:162
 TListOfFunctionTemplates.cxx:163
 TListOfFunctionTemplates.cxx:164
 TListOfFunctionTemplates.cxx:165
 TListOfFunctionTemplates.cxx:166
 TListOfFunctionTemplates.cxx:167
 TListOfFunctionTemplates.cxx:168
 TListOfFunctionTemplates.cxx:169
 TListOfFunctionTemplates.cxx:170
 TListOfFunctionTemplates.cxx:171
 TListOfFunctionTemplates.cxx:172
 TListOfFunctionTemplates.cxx:173
 TListOfFunctionTemplates.cxx:174
 TListOfFunctionTemplates.cxx:175
 TListOfFunctionTemplates.cxx:176
 TListOfFunctionTemplates.cxx:177
 TListOfFunctionTemplates.cxx:178
 TListOfFunctionTemplates.cxx:179
 TListOfFunctionTemplates.cxx:180
 TListOfFunctionTemplates.cxx:181
 TListOfFunctionTemplates.cxx:182
 TListOfFunctionTemplates.cxx:183
 TListOfFunctionTemplates.cxx:184
 TListOfFunctionTemplates.cxx:185
 TListOfFunctionTemplates.cxx:186
 TListOfFunctionTemplates.cxx:187
 TListOfFunctionTemplates.cxx:188
 TListOfFunctionTemplates.cxx:189
 TListOfFunctionTemplates.cxx:190
 TListOfFunctionTemplates.cxx:191
 TListOfFunctionTemplates.cxx:192
 TListOfFunctionTemplates.cxx:193
 TListOfFunctionTemplates.cxx:194
 TListOfFunctionTemplates.cxx:195
 TListOfFunctionTemplates.cxx:196
 TListOfFunctionTemplates.cxx:197
 TListOfFunctionTemplates.cxx:198
 TListOfFunctionTemplates.cxx:199
 TListOfFunctionTemplates.cxx:200
 TListOfFunctionTemplates.cxx:201
 TListOfFunctionTemplates.cxx:202
 TListOfFunctionTemplates.cxx:203
 TListOfFunctionTemplates.cxx:204
 TListOfFunctionTemplates.cxx:205
 TListOfFunctionTemplates.cxx:206
 TListOfFunctionTemplates.cxx:207
 TListOfFunctionTemplates.cxx:208
 TListOfFunctionTemplates.cxx:209
 TListOfFunctionTemplates.cxx:210
 TListOfFunctionTemplates.cxx:211
 TListOfFunctionTemplates.cxx:212
 TListOfFunctionTemplates.cxx:213
 TListOfFunctionTemplates.cxx:214
 TListOfFunctionTemplates.cxx:215
 TListOfFunctionTemplates.cxx:216
 TListOfFunctionTemplates.cxx:217
 TListOfFunctionTemplates.cxx:218
 TListOfFunctionTemplates.cxx:219
 TListOfFunctionTemplates.cxx:220
 TListOfFunctionTemplates.cxx:221
 TListOfFunctionTemplates.cxx:222
 TListOfFunctionTemplates.cxx:223
 TListOfFunctionTemplates.cxx:224
 TListOfFunctionTemplates.cxx:225
 TListOfFunctionTemplates.cxx:226
 TListOfFunctionTemplates.cxx:227
 TListOfFunctionTemplates.cxx:228
 TListOfFunctionTemplates.cxx:229
 TListOfFunctionTemplates.cxx:230
 TListOfFunctionTemplates.cxx:231
 TListOfFunctionTemplates.cxx:232
 TListOfFunctionTemplates.cxx:233
 TListOfFunctionTemplates.cxx:234
 TListOfFunctionTemplates.cxx:235
 TListOfFunctionTemplates.cxx:236
 TListOfFunctionTemplates.cxx:237
 TListOfFunctionTemplates.cxx:238
 TListOfFunctionTemplates.cxx:239
 TListOfFunctionTemplates.cxx:240
 TListOfFunctionTemplates.cxx:241
 TListOfFunctionTemplates.cxx:242
 TListOfFunctionTemplates.cxx:243
 TListOfFunctionTemplates.cxx:244
 TListOfFunctionTemplates.cxx:245
 TListOfFunctionTemplates.cxx:246
 TListOfFunctionTemplates.cxx:247
 TListOfFunctionTemplates.cxx:248
 TListOfFunctionTemplates.cxx:249
 TListOfFunctionTemplates.cxx:250
 TListOfFunctionTemplates.cxx:251
 TListOfFunctionTemplates.cxx:252
 TListOfFunctionTemplates.cxx:253
 TListOfFunctionTemplates.cxx:254
 TListOfFunctionTemplates.cxx:255
 TListOfFunctionTemplates.cxx:256
 TListOfFunctionTemplates.cxx:257
 TListOfFunctionTemplates.cxx:258
 TListOfFunctionTemplates.cxx:259
 TListOfFunctionTemplates.cxx:260
 TListOfFunctionTemplates.cxx:261
 TListOfFunctionTemplates.cxx:262
 TListOfFunctionTemplates.cxx:263
 TListOfFunctionTemplates.cxx:264
 TListOfFunctionTemplates.cxx:265
 TListOfFunctionTemplates.cxx:266
 TListOfFunctionTemplates.cxx:267
 TListOfFunctionTemplates.cxx:268
 TListOfFunctionTemplates.cxx:269
 TListOfFunctionTemplates.cxx:270
 TListOfFunctionTemplates.cxx:271
 TListOfFunctionTemplates.cxx:272
 TListOfFunctionTemplates.cxx:273
 TListOfFunctionTemplates.cxx:274
 TListOfFunctionTemplates.cxx:275
 TListOfFunctionTemplates.cxx:276
 TListOfFunctionTemplates.cxx:277
 TListOfFunctionTemplates.cxx:278
 TListOfFunctionTemplates.cxx:279
 TListOfFunctionTemplates.cxx:280
 TListOfFunctionTemplates.cxx:281
 TListOfFunctionTemplates.cxx:282
 TListOfFunctionTemplates.cxx:283
 TListOfFunctionTemplates.cxx:284
 TListOfFunctionTemplates.cxx:285
 TListOfFunctionTemplates.cxx:286
 TListOfFunctionTemplates.cxx:287
 TListOfFunctionTemplates.cxx:288
 TListOfFunctionTemplates.cxx:289
 TListOfFunctionTemplates.cxx:290
 TListOfFunctionTemplates.cxx:291
 TListOfFunctionTemplates.cxx:292
 TListOfFunctionTemplates.cxx:293
 TListOfFunctionTemplates.cxx:294
 TListOfFunctionTemplates.cxx:295
 TListOfFunctionTemplates.cxx:296
 TListOfFunctionTemplates.cxx:297
 TListOfFunctionTemplates.cxx:298
 TListOfFunctionTemplates.cxx:299
 TListOfFunctionTemplates.cxx:300
 TListOfFunctionTemplates.cxx:301
 TListOfFunctionTemplates.cxx:302
 TListOfFunctionTemplates.cxx:303
 TListOfFunctionTemplates.cxx:304
 TListOfFunctionTemplates.cxx:305
 TListOfFunctionTemplates.cxx:306
 TListOfFunctionTemplates.cxx:307
 TListOfFunctionTemplates.cxx:308
 TListOfFunctionTemplates.cxx:309
 TListOfFunctionTemplates.cxx:310
 TListOfFunctionTemplates.cxx:311
 TListOfFunctionTemplates.cxx:312
 TListOfFunctionTemplates.cxx:313
 TListOfFunctionTemplates.cxx:314
 TListOfFunctionTemplates.cxx:315
 TListOfFunctionTemplates.cxx:316
 TListOfFunctionTemplates.cxx:317
 TListOfFunctionTemplates.cxx:318
 TListOfFunctionTemplates.cxx:319
 TListOfFunctionTemplates.cxx:320
 TListOfFunctionTemplates.cxx:321
 TListOfFunctionTemplates.cxx:322
 TListOfFunctionTemplates.cxx:323
 TListOfFunctionTemplates.cxx:324
 TListOfFunctionTemplates.cxx:325
 TListOfFunctionTemplates.cxx:326
 TListOfFunctionTemplates.cxx:327
 TListOfFunctionTemplates.cxx:328
 TListOfFunctionTemplates.cxx:329
 TListOfFunctionTemplates.cxx:330
 TListOfFunctionTemplates.cxx:331
 TListOfFunctionTemplates.cxx:332
 TListOfFunctionTemplates.cxx:333
 TListOfFunctionTemplates.cxx:334
 TListOfFunctionTemplates.cxx:335
 TListOfFunctionTemplates.cxx:336
 TListOfFunctionTemplates.cxx:337
 TListOfFunctionTemplates.cxx:338
 TListOfFunctionTemplates.cxx:339
 TListOfFunctionTemplates.cxx:340
 TListOfFunctionTemplates.cxx:341
 TListOfFunctionTemplates.cxx:342
 TListOfFunctionTemplates.cxx:343
 TListOfFunctionTemplates.cxx:344
 TListOfFunctionTemplates.cxx:345
 TListOfFunctionTemplates.cxx:346
 TListOfFunctionTemplates.cxx:347
 TListOfFunctionTemplates.cxx:348
 TListOfFunctionTemplates.cxx:349
 TListOfFunctionTemplates.cxx:350
 TListOfFunctionTemplates.cxx:351
 TListOfFunctionTemplates.cxx:352
 TListOfFunctionTemplates.cxx:353
 TListOfFunctionTemplates.cxx:354
 TListOfFunctionTemplates.cxx:355
 TListOfFunctionTemplates.cxx:356
 TListOfFunctionTemplates.cxx:357
 TListOfFunctionTemplates.cxx:358
 TListOfFunctionTemplates.cxx:359
 TListOfFunctionTemplates.cxx:360
 TListOfFunctionTemplates.cxx:361
 TListOfFunctionTemplates.cxx:362
 TListOfFunctionTemplates.cxx:363
 TListOfFunctionTemplates.cxx:364
 TListOfFunctionTemplates.cxx:365
 TListOfFunctionTemplates.cxx:366
 TListOfFunctionTemplates.cxx:367
 TListOfFunctionTemplates.cxx:368
 TListOfFunctionTemplates.cxx:369
 TListOfFunctionTemplates.cxx:370
 TListOfFunctionTemplates.cxx:371
 TListOfFunctionTemplates.cxx:372
 TListOfFunctionTemplates.cxx:373
 TListOfFunctionTemplates.cxx:374
 TListOfFunctionTemplates.cxx:375
 TListOfFunctionTemplates.cxx:376
 TListOfFunctionTemplates.cxx:377
 TListOfFunctionTemplates.cxx:378
 TListOfFunctionTemplates.cxx:379
 TListOfFunctionTemplates.cxx:380
 TListOfFunctionTemplates.cxx:381
 TListOfFunctionTemplates.cxx:382
 TListOfFunctionTemplates.cxx:383
 TListOfFunctionTemplates.cxx:384
 TListOfFunctionTemplates.cxx:385
 TListOfFunctionTemplates.cxx:386
 TListOfFunctionTemplates.cxx:387
 TListOfFunctionTemplates.cxx:388
 TListOfFunctionTemplates.cxx:389
 TListOfFunctionTemplates.cxx:390
 TListOfFunctionTemplates.cxx:391
 TListOfFunctionTemplates.cxx:392
 TListOfFunctionTemplates.cxx:393
 TListOfFunctionTemplates.cxx:394
 TListOfFunctionTemplates.cxx:395
 TListOfFunctionTemplates.cxx:396
 TListOfFunctionTemplates.cxx:397
 TListOfFunctionTemplates.cxx:398
 TListOfFunctionTemplates.cxx:399
 TListOfFunctionTemplates.cxx:400
 TListOfFunctionTemplates.cxx:401
 TListOfFunctionTemplates.cxx:402
 TListOfFunctionTemplates.cxx:403
 TListOfFunctionTemplates.cxx:404
 TListOfFunctionTemplates.cxx:405
 TListOfFunctionTemplates.cxx:406
 TListOfFunctionTemplates.cxx:407
 TListOfFunctionTemplates.cxx:408