#ifndef __HARRAY_H__
#define __HARRAY_H__
#include "TNamed.h"
#include "TArrayC.h"
#include "TArrayS.h"
#include "TArrayI.h"
#include "TArrayL.h"
#include "TArrayL64.h"
#include "TArrayF.h"
#include "TArrayD.h"
#include <iostream>
#include <iomanip>
using namespace std;
class HArrayC : public TNamed {
public:
TArrayC* data;
HArrayC() { data = NULL;};
HArrayC(Int_t n) { data = new TArrayC(n);}
HArrayC(Int_t n , Char_t* dat) { data = new TArrayC(n,dat);}
HArrayC(TArrayC& dat) { data = new TArrayC(dat.GetSize(),dat.GetArray());}
~HArrayC() { if(data) delete data; }
Char_t& operator[](Int_t i) { return (*data)[i]; };
Char_t operator[](Int_t i) const { return (*data)[i]; };
TArrayC* getData() { return data;}
Char_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Char_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayC,1)
};
class HArrayS : public TNamed {
public:
TArrayS* data;
HArrayS() { data = NULL;};
HArrayS(Int_t n) { data = new TArrayS(n);}
HArrayS(Int_t n , Short_t* dat) { data = new TArrayS(n,dat);}
HArrayS(TArrayS& dat) { data = new TArrayS(dat.GetSize(),dat.GetArray());}
~HArrayS() { if(data) delete data; }
Short_t& operator[](Int_t i) { return (*data)[i]; };
Short_t operator[](Int_t i) const { return (*data)[i]; };
TArrayS* getData() { return data;}
Short_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Short_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayS,1)
};
class HArrayI : public TNamed {
public:
TArrayI* data;
HArrayI() { data = NULL;};
HArrayI(Int_t n) { data = new TArrayI(n);}
HArrayI(Int_t n , Int_t* dat) { data = new TArrayI(n,dat);}
HArrayI(TArrayI& dat) { data = new TArrayI(dat.GetSize(),dat.GetArray());}
~HArrayI() { if(data) delete data; }
Int_t& operator[](Int_t i) { return (*data)[i]; };
Int_t operator[](Int_t i) const { return (*data)[i]; };
TArrayI* getData() { return data;}
Int_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Int_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayI,1)
};
class HArrayL : public TNamed {
public:
TArrayL* data;
HArrayL() { data = NULL;};
HArrayL(Int_t n) { data = new TArrayL(n);}
HArrayL(Int_t n , Long_t* dat) { data = new TArrayL(n,dat);}
HArrayL(TArrayL& dat) { data = new TArrayL(dat.GetSize(),dat.GetArray());}
~HArrayL() { if(data) delete data; }
Long_t& operator[](Int_t i) { return (*data)[i]; };
Long_t operator[](Int_t i) const { return (*data)[i]; };
TArrayL* getData() { return data;}
Long_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Long_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayL,1)
};
class HArrayL64 : public TNamed {
public:
TArrayL64* data;
HArrayL64() { data = NULL;};
HArrayL64(Int_t n) { data = new TArrayL64(n);}
HArrayL64(Int_t n , Long64_t* dat) { data = new TArrayL64(n,dat);}
HArrayL64(TArrayL64& dat) { data = new TArrayL64(dat.GetSize(),dat.GetArray());}
~HArrayL64() { if(data) delete data; }
Long64_t& operator[](Int_t i) { return (*data)[i]; };
Long64_t operator[](Int_t i) const { return (*data)[i]; };
TArrayL64* getData() { return data;}
Long64_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Long64_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayL64,1)
};
class HArrayF : public TNamed {
public:
TArrayF* data;
HArrayF() { data = NULL;};
HArrayF(Int_t n) { data = new TArrayF(n);}
HArrayF(Int_t n , Float_t* dat) { data = new TArrayF(n,dat);}
HArrayF(TArrayF& dat) { data = new TArrayF(dat.GetSize(),dat.GetArray());}
~HArrayF() { if(data) delete data; }
Float_t& operator[](Int_t i) { return (*data)[i]; };
Float_t operator[](Int_t i) const { return (*data)[i]; };
TArrayF* getData() { return data;}
Float_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Float_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayF,1)
};
class HArrayD : public TNamed {
public:
TArrayD* data;
HArrayD() { data = NULL;};
HArrayD(Int_t n) { data = new TArrayD(n);}
HArrayD(Int_t n , Double_t* dat) { data = new TArrayD(n,dat);}
HArrayD(TArrayD& dat) { data = new TArrayD(dat.GetSize(),dat.GetArray());}
~HArrayD() { if(data) delete data; }
Double_t& operator[](Int_t i) { return (*data)[i]; };
Double_t operator[](Int_t i) const { return (*data)[i]; };
TArrayD* getData() { return data;}
Double_t* getArray() { if(data) return data->GetArray(); else return NULL;}
Int_t getSize() { if(data) return data->GetSize(); else return 0;}
void reset(Double_t val=0) { if(data) data->Reset(val); }
void print() { if(data) { cout<<GetName()<<"---------------------"<<endl; for(Int_t i=0;i < getSize();i++) {cout<<setw(5)<<i<<(*data)[i]<<endl;}}}
ClassDef(HArrayD,1)
};
#endif /* !__HARRAY_H__ */