// @(#)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.             *
 *************************************************************************/

#ifndef ROOT_TListOfFunctions
#define ROOT_TListOfFunctions

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

#ifndef ROOT_THastList
#include "THashList.h"
#endif

#ifndef ROOT_THastTable
#include "THashTable.h"
#endif

#ifndef ROOT_TDictionary
#include "TDictionary.h"
#endif

class TExMap;
class TFunction;

class TListOfFunctions : public THashList
{
private:
   TClass    *fClass; // Context of this list.  Not owned.

   TExMap    *fIds;      // Map from DeclId_t to TFunction*
   THashList *fUnloaded; // Holder of TFunction for unloaded functions.
   THashTable fOverloads; // TLists of overloads.
   ULong64_t  fLastLoadMarker; // Represent interpreter state when we last did a full load.

   TListOfFunctions(const TListOfFunctions&);              // not implemented
   TListOfFunctions& operator=(const TListOfFunctions&);   // not implemented
   TList     *GetListForObjectNonConst(const char* name);

   void       MapObject(TObject *obj);
   void       UnmapObject(TObject *obj);

public:
   typedef TDictionary::DeclId_t DeclId_t;

   TListOfFunctions(TClass *cl);
   ~TListOfFunctions();

   virtual void Clear(Option_t *option);
   virtual void Delete(Option_t *option="");

   virtual TObject   *FindObject(const TObject* obj) const;
   virtual TObject   *FindObject(const char *name) const;
   virtual TList     *GetListForObject(const char* name) const;
   virtual TList     *GetListForObject(const TObject* obj) const;
   virtual TIterator *MakeIterator(Bool_t dir = kIterForward) const;

   virtual TObject  *At(Int_t idx) const;
   virtual TObject  *After(const TObject *obj) const;
   virtual TObject  *Before(const TObject *obj) const;
   virtual TObject  *First() const;
   virtual TObjLink *FirstLink() const;
   virtual TObject **GetObjectRef(const TObject *obj) const;
   virtual TObject  *Last() const;
   virtual TObjLink *LastLink() const;

   virtual Int_t     GetLast() const;
   virtual Int_t     IndexOf(const TObject *obj) const;

   virtual Int_t      GetSize() const;


   TFunction *Find(DeclId_t id) const;
   TFunction *Get(DeclId_t id);

   void       AddFirst(TObject *obj);
   void       AddFirst(TObject *obj, Option_t *opt);
   void       AddLast(TObject *obj);
   void       AddLast(TObject *obj, Option_t *opt);
   void       AddAt(TObject *obj, Int_t idx);
   void       AddAfter(const TObject *after, TObject *obj);
   void       AddAfter(TObjLink *after, TObject *obj);
   void       AddBefore(const TObject *before, TObject *obj);
   void       AddBefore(TObjLink *before, TObject *obj);

   void       RecursiveRemove(TObject *obj);
   TObject   *Remove(TObject *obj);
   TObject   *Remove(TObjLink *lnk);

   void Load();
   void Unload();
   void Unload(TFunction *func);

   ClassDef(TListOfFunctions,0);  // List of TFunctions for a class
};

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfFunctionsIter                                                 //
//                                                                      //
// Iterator of TListOfFunctions.                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
class TListOfFunctionsIter : public TListIter
{
public:
   TListOfFunctionsIter(const TListOfFunctions *l, Bool_t dir = kIterForward);

   using TListIter::operator=;

   TObject           *Next();

   ClassDef(TListOfFunctionsIter,0)
};


#endif // ROOT_TListOfFunctions
 TListOfFunctions.h:1
 TListOfFunctions.h:2
 TListOfFunctions.h:3
 TListOfFunctions.h:4
 TListOfFunctions.h:5
 TListOfFunctions.h:6
 TListOfFunctions.h:7
 TListOfFunctions.h:8
 TListOfFunctions.h:9
 TListOfFunctions.h:10
 TListOfFunctions.h:11
 TListOfFunctions.h:12
 TListOfFunctions.h:13
 TListOfFunctions.h:14
 TListOfFunctions.h:15
 TListOfFunctions.h:16
 TListOfFunctions.h:17
 TListOfFunctions.h:18
 TListOfFunctions.h:19
 TListOfFunctions.h:20
 TListOfFunctions.h:21
 TListOfFunctions.h:22
 TListOfFunctions.h:23
 TListOfFunctions.h:24
 TListOfFunctions.h:25
 TListOfFunctions.h:26
 TListOfFunctions.h:27
 TListOfFunctions.h:28
 TListOfFunctions.h:29
 TListOfFunctions.h:30
 TListOfFunctions.h:31
 TListOfFunctions.h:32
 TListOfFunctions.h:33
 TListOfFunctions.h:34
 TListOfFunctions.h:35
 TListOfFunctions.h:36
 TListOfFunctions.h:37
 TListOfFunctions.h:38
 TListOfFunctions.h:39
 TListOfFunctions.h:40
 TListOfFunctions.h:41
 TListOfFunctions.h:42
 TListOfFunctions.h:43
 TListOfFunctions.h:44
 TListOfFunctions.h:45
 TListOfFunctions.h:46
 TListOfFunctions.h:47
 TListOfFunctions.h:48
 TListOfFunctions.h:49
 TListOfFunctions.h:50
 TListOfFunctions.h:51
 TListOfFunctions.h:52
 TListOfFunctions.h:53
 TListOfFunctions.h:54
 TListOfFunctions.h:55
 TListOfFunctions.h:56
 TListOfFunctions.h:57
 TListOfFunctions.h:58
 TListOfFunctions.h:59
 TListOfFunctions.h:60
 TListOfFunctions.h:61
 TListOfFunctions.h:62
 TListOfFunctions.h:63
 TListOfFunctions.h:64
 TListOfFunctions.h:65
 TListOfFunctions.h:66
 TListOfFunctions.h:67
 TListOfFunctions.h:68
 TListOfFunctions.h:69
 TListOfFunctions.h:70
 TListOfFunctions.h:71
 TListOfFunctions.h:72
 TListOfFunctions.h:73
 TListOfFunctions.h:74
 TListOfFunctions.h:75
 TListOfFunctions.h:76
 TListOfFunctions.h:77
 TListOfFunctions.h:78
 TListOfFunctions.h:79
 TListOfFunctions.h:80
 TListOfFunctions.h:81
 TListOfFunctions.h:82
 TListOfFunctions.h:83
 TListOfFunctions.h:84
 TListOfFunctions.h:85
 TListOfFunctions.h:86
 TListOfFunctions.h:87
 TListOfFunctions.h:88
 TListOfFunctions.h:89
 TListOfFunctions.h:90
 TListOfFunctions.h:91
 TListOfFunctions.h:92
 TListOfFunctions.h:93
 TListOfFunctions.h:94
 TListOfFunctions.h:95
 TListOfFunctions.h:96
 TListOfFunctions.h:97
 TListOfFunctions.h:98
 TListOfFunctions.h:99
 TListOfFunctions.h:100
 TListOfFunctions.h:101
 TListOfFunctions.h:102
 TListOfFunctions.h:103
 TListOfFunctions.h:104
 TListOfFunctions.h:105
 TListOfFunctions.h:106
 TListOfFunctions.h:107
 TListOfFunctions.h:108
 TListOfFunctions.h:109
 TListOfFunctions.h:110
 TListOfFunctions.h:111
 TListOfFunctions.h:112
 TListOfFunctions.h:113
 TListOfFunctions.h:114
 TListOfFunctions.h:115
 TListOfFunctions.h:116
 TListOfFunctions.h:117
 TListOfFunctions.h:118
 TListOfFunctions.h:119
 TListOfFunctions.h:120
 TListOfFunctions.h:121
 TListOfFunctions.h:122
 TListOfFunctions.h:123
 TListOfFunctions.h:124
 TListOfFunctions.h:125
 TListOfFunctions.h:126
 TListOfFunctions.h:127
 TListOfFunctions.h:128
 TListOfFunctions.h:129
 TListOfFunctions.h:130
 TListOfFunctions.h:131