// @(#)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_TListOfEnumsWithLock
#define ROOT_TListOfEnumsWithLock

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

#include "TListOfEnums.h"

class TExMap;
class TEnum;

class TListOfEnumsWithLock : public TListOfEnums
{
private:
   typedef TDictionary::DeclId_t DeclId_t;

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

public:

   TListOfEnumsWithLock(TClass *cl = nullptr);
   ~TListOfEnumsWithLock() override;

   TEnum *GetObject(const char*) const override;

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

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

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

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

   Int_t      GetSize() const override;

   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       AddAt(TObject *obj, Int_t idx, Option_t *opt) override;
   void       AddAfter(const TObject *after, TObject *obj) override;
   void       AddAfter(TObjLink *after, TObject *obj) override;
   void       AddAfter(const TObject *after, TObject *obj, Option_t *opt) override;
   void       AddAfter(TObjLink *after, TObject *obj, Option_t *opt) override;
   void       AddBefore(const TObject *before, TObject *obj) override;
   void       AddBefore(TObjLink *before, TObject *obj) override;
   void       AddBefore(const TObject *before, TObject *obj, Option_t *opt) override;
   void       AddBefore(TObjLink *before, TObject *obj, Option_t *opt) override;

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

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


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

   using TListIter::operator=;

   TObject *Next() override;

   ClassDefOverride(TListOfEnumsWithLockIter,0)
};

#endif // ROOT_TListOfEnumsWithLock
