// @(#)root/cont
// Author: Bianca-Cristina Cristescu February 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.             *
 *************************************************************************/

#ifndef ROOT_TListOfEnums
#define ROOT_TListOfEnums

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfEnums                                                         //
//                                                                      //
// A collection of TEnum objects designed for fast access given a       //
// DeclId_t and for keep track of TEnum that were described             //
// unloaded enum.                                                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

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

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

class TExMap;
class TEnum;

class TListOfEnums : public THashList
{
private:
   friend class TCling;
   friend class TClass;
   friend class TProtoClass;
   friend class TROOT;

   TClass    *fClass; //! Context of this list.  Not owned.

   TExMap    *fIds;      //! Map from DeclId_t to TEnum*
   THashList *fUnloaded; //! Holder of TEnum for unloaded Enums.
   Bool_t     fIsLoaded; //! Mark whether Load was executed.
   ULong64_t  fLastLoadMarker; //! Represent interpreter state when we last did a full load.

   TListOfEnums(const TListOfEnums&) = delete;
   TListOfEnums& operator=(const TListOfEnums&) = delete;

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

   void Load();
   void Unload();
   void Unload(TEnum *e);
   void SetClass(TClass* cl) { fClass = cl; }

public:
   typedef TDictionary::DeclId_t DeclId_t;

protected:
   TClass *GetClass() const {return fClass;}
   TExMap *GetIds() { return fIds;}
   TEnum  *FindUnloaded(const char* name) { return (TEnum*)fUnloaded->FindObject(name);}
   TEnum  *Get(DeclId_t id, const char *name);

public:
   TListOfEnums(TClass *cl = 0);
   ~TListOfEnums() override;

   TEnum     *Find(DeclId_t id) const;
   virtual TEnum *GetObject(const char*) const;

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

   Bool_t     IsLoaded() const { return fIsLoaded; }
   void       AddFirst(TObject *obj) override;
   void       AddFirst(TObject *obj, Option_t *opt) override;
   void       AddLast(TObject *obj) override;
   void       AddLast(TObject *obj, Option_t *opt) override;
   void       AddAt(TObject *obj, Int_t idx) override;
   void       AddAfter(const TObject *after, TObject *obj) override;
   void       AddAfter(TObjLink *after, TObject *obj) override;
   void       AddBefore(const TObject *before, TObject *obj) override;
   void       AddBefore(TObjLink *before, TObject *obj) override;

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

   ClassDefOverride(TListOfEnums,2);  // List of TDataMembers for a class
};

#endif // ROOT_TListOfEnums
 TListOfEnums.h:1
 TListOfEnums.h:2
 TListOfEnums.h:3
 TListOfEnums.h:4
 TListOfEnums.h:5
 TListOfEnums.h:6
 TListOfEnums.h:7
 TListOfEnums.h:8
 TListOfEnums.h:9
 TListOfEnums.h:10
 TListOfEnums.h:11
 TListOfEnums.h:12
 TListOfEnums.h:13
 TListOfEnums.h:14
 TListOfEnums.h:15
 TListOfEnums.h:16
 TListOfEnums.h:17
 TListOfEnums.h:18
 TListOfEnums.h:19
 TListOfEnums.h:20
 TListOfEnums.h:21
 TListOfEnums.h:22
 TListOfEnums.h:23
 TListOfEnums.h:24
 TListOfEnums.h:25
 TListOfEnums.h:26
 TListOfEnums.h:27
 TListOfEnums.h:28
 TListOfEnums.h:29
 TListOfEnums.h:30
 TListOfEnums.h:31
 TListOfEnums.h:32
 TListOfEnums.h:33
 TListOfEnums.h:34
 TListOfEnums.h:35
 TListOfEnums.h:36
 TListOfEnums.h:37
 TListOfEnums.h:38
 TListOfEnums.h:39
 TListOfEnums.h:40
 TListOfEnums.h:41
 TListOfEnums.h:42
 TListOfEnums.h:43
 TListOfEnums.h:44
 TListOfEnums.h:45
 TListOfEnums.h:46
 TListOfEnums.h:47
 TListOfEnums.h:48
 TListOfEnums.h:49
 TListOfEnums.h:50
 TListOfEnums.h:51
 TListOfEnums.h:52
 TListOfEnums.h:53
 TListOfEnums.h:54
 TListOfEnums.h:55
 TListOfEnums.h:56
 TListOfEnums.h:57
 TListOfEnums.h:58
 TListOfEnums.h:59
 TListOfEnums.h:60
 TListOfEnums.h:61
 TListOfEnums.h:62
 TListOfEnums.h:63
 TListOfEnums.h:64
 TListOfEnums.h:65
 TListOfEnums.h:66
 TListOfEnums.h:67
 TListOfEnums.h:68
 TListOfEnums.h:69
 TListOfEnums.h:70
 TListOfEnums.h:71
 TListOfEnums.h:72
 TListOfEnums.h:73
 TListOfEnums.h:74
 TListOfEnums.h:75
 TListOfEnums.h:76
 TListOfEnums.h:77
 TListOfEnums.h:78
 TListOfEnums.h:79
 TListOfEnums.h:80
 TListOfEnums.h:81
 TListOfEnums.h:82
 TListOfEnums.h:83
 TListOfEnums.h:84
 TListOfEnums.h:85
 TListOfEnums.h:86
 TListOfEnums.h:87
 TListOfEnums.h:88
 TListOfEnums.h:89
 TListOfEnums.h:90
 TListOfEnums.h:91
 TListOfEnums.h:92
 TListOfEnums.h:93
 TListOfEnums.h:94
 TListOfEnums.h:95
 TListOfEnums.h:96
 TListOfEnums.h:97
 TListOfEnums.h:98
 TListOfEnums.h:99