#ifndef HENRIK_CLUSTER_LIST_H
#define HENRIK_CLUSTER_LIST_H

//////////////////////////////////////////////////////////////////////
// Author: Henrik Tydesjo                                           //
// This class implements the use of a list of clusters.             //
//                                                                  //
//////////////////////////////////////////////////////////////////////  

#include <Rtypes.h>

class HenrikClusterListNode;

class HenrikClusterList {

 public:
  HenrikClusterList();
  HenrikClusterList(HenrikClusterListNode* first,UInt_t nrEntries);
  HenrikClusterList(const HenrikClusterList& ilist);
  virtual ~HenrikClusterList();
  HenrikClusterList& operator=(const HenrikClusterList& ilist);

  void                   Clear();
  HenrikClusterList*     Clone() const;
  Bool_t                 Insert(Float_t col, Float_t row, UShort_t size, UShort_t widthZ, UShort_t widthPhi, UShort_t type);

  UInt_t   GetNrEntries() const {return fNrEntries;}
  Float_t  GetColIndex(UInt_t index);
  Float_t  GetRowIndex(UInt_t index);
  UShort_t GetSizeIndex(UInt_t index);
  UShort_t GetWidthZIndex(UInt_t index);
  UShort_t GetWidthPhiIndex(UInt_t index);
  UShort_t GetTypeIndex(UInt_t index);

 private:
  UInt_t                 fNrEntries;
  HenrikClusterListNode* fFirst;
  HenrikClusterListNode* fLast;

  Bool_t                  fFastAccess;
  HenrikClusterListNode** fFastAccessArray;
  UInt_t                  fDummyIndex;


  void                   ClearNode(HenrikClusterListNode* &node); // delete this node and all after
  HenrikClusterListNode* CloneNode(HenrikClusterListNode* node) const;

  void                   ClearFastAccess();
  void                   InitFastAccess();
  void                   InitFastAccessNode(HenrikClusterListNode* node);
  void                   SetLastNode();

};

#endif
