// @(#)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_TListOfDataMembers
#define ROOT_TListOfDataMembers

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfDataMembers                                                   //
//                                                                      //
// A collection of TDataMember objects designed for fast access given a //
// DeclId_t and for keep track of TDataMember that were described       //
// unloaded member.                                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

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

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

class TExMap;
class TDataMember;

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

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

   TListOfDataMembers(const TListOfDataMembers&);              // not implemented
   TListOfDataMembers& operator=(const TListOfDataMembers&);   // not implemented

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

public:
   typedef TDictionary::DeclId_t DeclId_t;

   TListOfDataMembers(TClass *cl = 0);
   // construct from a generic collection of data members objects
   template<class DataMemberList>
   TListOfDataMembers(DataMemberList & dmlist) :
      fClass(0),fIds(0),fUnloaded(0),
      fIsLoaded(kTRUE), fLastLoadMarker(0)
   {
      for (auto * dataMember : dmlist)
         Add(dataMember);
   }

   ~TListOfDataMembers();

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

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

   TDictionary *Find(DeclId_t id) const;
   TDictionary *Get(DeclId_t id);
   TDictionary *Get(DataMemberInfo_t *info, bool skipChecks=kFALSE);

   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);

   TClass    *GetClass() const { return fClass; }
   void       SetClass(TClass* cl) { fClass = cl; }
   void       Update(TDictionary *member);

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

   void Load();
   void Unload();
   void Unload(TDictionary *member);

   ClassDef(TListOfDataMembers,2);  // List of TDataMembers for a class
};

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