#ifndef ROOT_TClonesArray
#define ROOT_TClonesArray

//+SEQ,CopyRight,T=NOINCLUDE.

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TClonesArray                                                         //
//                                                                      //
// An array of clone TObjects. The array expands automatically when     //
// adding elements (shrinking can be done by hand).                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObjArray
//*KEEP,TObjArray.
#include "TObjArray.h"
//*KEND.
#endif

class TClass;


class TClonesArray : public TObjArray {

private:
   TClass       *fClass;       //Pointer to the class
   TObjArray    *fKeep;        //Saved copies of pointers to objects

public:
   TClonesArray();
   TClonesArray(const Text_t *classname, Int_t size = 1000, Bool_t call_dtor = kFALSE);
   virtual       ~TClonesArray();
   void          Compress();
   void          Clear(Option_t *option="");
   void          Delete(Option_t *option="");
   void          Expand(Int_t newSize);
   void          ExpandCreate(Int_t n);
   TClass       *GetClass() { return fClass; }

   void          AddFirst(TObject *) { MayNotUse("AddFirst"); }
   void          AddLast(TObject *) { MayNotUse("AddLast"); }
   void          AddAt(TObject *, Int_t) { MayNotUse("AddAt"); }
   void          AddAtAndExpand(TObject *, Int_t) { MayNotUse("AddAtAndExpand"); }
   Int_t         AddAtFree(TObject *) { MayNotUse("AddAtFree"); return 0; }
   void          AddAfter(TObject *, TObject *) { MayNotUse("AddAfter"); }
   void          AddBefore(TObject *, TObject *) { MayNotUse("AddBefore"); }

   TObject      *RemoveAt(Int_t idx);
   TObject      *Remove(TObject *obj);
   void          Sort(Int_t upto = kMaxInt);

   TObject      *AddrAt(Int_t i);
   TObject      *&operator[](Int_t i);

   ClassDef(TClonesArray,1)  //An array of clone objects
};

inline TObject *TClonesArray::AddrAt(Int_t i)
{
   return operator[](i);
}

#endif