// @(#)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:
   typedef TDictionary::DeclId_t DeclId_t;
   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&);              // not implemented
   TListOfEnums& operator=(const TListOfEnums&);   // not implemented

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

public:

   TListOfEnums(TClass *cl);
   ~TListOfEnums();

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

   using THashList::FindObject;
   virtual TObject   *FindObject(const char *name) const;

   TEnum *Get(DeclId_t id, const char *name);

   Bool_t     IsLoaded() const { return fIsLoaded; }
   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(TEnum *e);

   ClassDef(TListOfEnums,0);  // 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