18 #include <forward_list>
28 const unsigned int listSize=3;
30 ClassImp(TListOfEnums);
35 TListOfEnums::TListOfEnums(TClass *cl ) :
36 THashList(listSize), fClass(cl), fIds(0), fUnloaded(0), fIsLoaded(kFALSE), fLastLoadMarker(0)
38 fIds =
new TExMap(listSize);
39 fUnloaded =
new THashList(listSize);
45 TListOfEnums::~TListOfEnums()
56 void TListOfEnums::MapObject(TObject *obj)
58 TEnum *e =
dynamic_cast<TEnum *
>(obj);
59 if (e && e->GetDeclId()) {
60 fIds->Add((Long64_t)e->GetDeclId(), (Long64_t)e);
67 void TListOfEnums::AddFirst(TObject *obj)
69 THashList::AddFirst(obj);
80 void TListOfEnums::AddFirst(TObject *obj, Option_t *opt)
82 THashList::AddFirst(obj, opt);
89 void TListOfEnums::AddLast(TObject *obj)
91 THashList::AddLast(obj);
102 void TListOfEnums::AddLast(TObject *obj, Option_t *opt)
104 THashList::AddLast(obj, opt);
111 void TListOfEnums::AddAt(TObject *obj, Int_t idx)
113 THashList::AddAt(obj, idx);
120 void TListOfEnums::AddAfter(
const TObject *after, TObject *obj)
122 THashList::AddAfter(after, obj);
129 void TListOfEnums::AddAfter(TObjLink *after, TObject *obj)
131 THashList::AddAfter(after, obj);
138 void TListOfEnums::AddBefore(
const TObject *before, TObject *obj)
140 THashList::AddBefore(before, obj);
147 void TListOfEnums::AddBefore(TObjLink *before, TObject *obj)
149 THashList::AddBefore(before, obj);
157 void TListOfEnums::Clear(Option_t *option)
159 fUnloaded->Clear(option);
161 THashList::Clear(option);
168 void TListOfEnums::Delete(Option_t *option )
170 fUnloaded->Delete(option);
171 THashList::Delete(option);
179 TEnum *TListOfEnums::Find(DeclId_t
id)
const
183 return (TEnum *)fIds->GetValue((Long64_t)
id);
190 TEnum *TListOfEnums::Get(DeclId_t
id,
const char *name)
199 #if defined(R__MUST_REVISIT)
200 # if R__MUST_REVISIT(6,4)
201 "This special case can be removed once PCMs are available."
204 e =
static_cast<TEnum*
>(THashList::FindObject(name));
208 if (0 == e->GetDeclId()){
210 fIds->Add((Long64_t)
id, (Long64_t)e);
211 gInterpreter->UpdateEnumConstants(e, fClass);
217 if (!fClass->HasInterpreterInfoInMemory()) {
225 if (!gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(), id))
return 0;
227 if (!gInterpreter->ClassInfo_Contains(0,
id))
return 0;
230 R__LOCKGUARD(gInterpreterMutex);
234 e = (TEnum *)fUnloaded->FindObject(name);
237 gInterpreter->UpdateEnumConstants(e, fClass);
239 e = gInterpreter->CreateEnum((
void *)
id, fClass);
243 THashList::AddLast(e);
244 fIds->Add((Long64_t)
id, (Long64_t)e);
253 TEnum *TListOfEnums::GetObject(
const char *name)
const
255 return (TEnum*)THashList::FindObject(name);
261 void TListOfEnums::UnmapObject(TObject *obj)
263 TEnum *e =
dynamic_cast<TEnum *
>(obj);
265 fIds->Remove((Long64_t)e->GetDeclId());
278 void TListOfEnums::RecursiveRemove(TObject *obj)
282 THashList::RecursiveRemove(obj);
283 fUnloaded->RecursiveRemove(obj);
290 TObject *TListOfEnums::Remove(TObject *obj)
294 found = THashList::Remove(obj);
296 found = fUnloaded->Remove(obj);
299 if (found)
return obj;
306 TObject *TListOfEnums::Remove(TObjLink *lnk)
310 TObject *obj = lnk->GetObject();
312 THashList::Remove(lnk);
313 fUnloaded->Remove(obj);
322 void TListOfEnums::Load()
324 if (fClass && fClass->Property() & (kIsClass | kIsStruct | kIsUnion)) {
327 if (fIsLoaded)
return;
331 if (fClass && fClass->GetClassInfo() == 0)
return;
333 R__LOCKGUARD(gInterpreterMutex);
335 ULong64_t currentTransaction = gInterpreter->GetInterpreterStateMarker();
336 if (currentTransaction == fLastLoadMarker) {
339 fLastLoadMarker = currentTransaction;
352 #if defined(R__MUST_REVISIT)
353 # if R__MUST_REVISIT(6,4)
354 "This special case can be removed once PCMs are available."
358 std::forward_list<TEnum*> respownedEnums;
359 for (
auto enumAsObj : *fUnloaded){
360 TEnum* en =
static_cast<TEnum*
>(enumAsObj);
361 if (0 == en->GetDeclId()){
362 THashList::AddLast(en);
363 respownedEnums.push_front(en);
367 for (
auto en : respownedEnums)
368 fUnloaded->Remove(en);
373 gInterpreter->LoadEnums(*
this);
382 void TListOfEnums::Unload()
384 TObjLink *lnk = FirstLink();
386 TEnum *data = (TEnum *)lnk->GetObject();
388 if (data->GetDeclId())
389 fIds->Remove((Long64_t)data->GetDeclId());
390 fUnloaded->Add(data);
405 void TListOfEnums::Unload(TEnum *e)
407 if (THashList::Remove(e)) {
411 fIds->Remove((Long64_t)e->GetDeclId());