#ifndef TINTLIST_H
#define TINTLIST_H

#include "TObject.h"
#include "TROOT.h"

#include <iostream>
using std::cout;
using std::endl;

class TObjNum : public TObject {
private:
    Int_t  num;

public: 
    TObjNum(Int_t i = 0) : num(i) { }
    ~TObjNum() {  }
   
    virtual void  SetNum(Int_t i)   { num = i;    }
    virtual Int_t GetNum()  const  { return num; }
   
    void    Print(Option_t * /* option */ = "") const { cout << num << endl;  }
   
    Bool_t  IsEqual(const TObject *obj) const
			      { return num == ((TObjNum*)obj)->GetNum();   }
      
    Bool_t  IsSortable() const { return kTRUE; }
      
    virtual Int_t   Compare(const TObject *obj) const 
				  { if (num > ((TObjNum*)obj)->GetNum())
				      return 1;
				   else if (num < ((TObjNum*)obj)->GetNum())
				      return -1;
				   else return 0; }
				   
ClassDef(TObjNum, 1)            // Simple Class for an integer.
};

class TIntList : public TObject
{
private:
    TList     *fList;
    TObjNum   *fNum; 
  
public:
    
    TIntList();
    ~TIntList();
    
    void Add(Int_t num); 
    void AddFirst(Int_t num);
    void AddLast(Int_t num);
    void AddAt(Int_t num, Int_t idx);
    
    Int_t First(void);
    Int_t Last(void);
    
    void Remove(Int_t element);
    void Delete(Option_t* option = "");
    
    Int_t At(Int_t slot);
    Int_t NumberOfElements(void);
    Bool_t Exists(Int_t num);    

    void Sort()            	       { fList->Sort();  }
    void Print(Option_t * /* option */ = "") const { fList->Print(); }

ClassDef(TIntList, 1)        // A double linked list to hold integers.
};

#endif
