00001 #include "TMath.h"
00002 #include "GtHash.h"
00003
00004 class GtCradle : public TObject
00005 {
00006 public:
00007 Int_t fNWords;
00008 ULong_t *fArray;
00009 void *fPointer;
00010
00011 GtCradle(int n);
00012 ~GtCradle(){ if (fArray) delete [] fArray;};
00013
00014 protected:
00015 virtual Bool_t IsEqual(const TObject* obj) const;
00016 virtual ULong_t Hash() const;
00017 };
00018
00019 GtCradle::GtCradle(int n)
00020 {
00021 fNWords = n;
00022 fArray = new ULong_t[fNWords];
00023 fPointer=0;
00024 }
00025
00026 Bool_t GtCradle::IsEqual(const TObject* obj) const
00027 {
00028 GtCradle *He = (GtCradle*)obj;
00029 if (fNWords != He->fNWords) return 0;
00030 ULong_t *me = fArray;
00031 ULong_t *he = He->fArray;
00032 if (me[0] != he[0]) return 0;
00033 for (int i=1; i<fNWords; i++) if (me[i]!=he[i]) return 0;
00034 return 1;
00035 }
00036 ULong_t GtCradle::Hash() const
00037 {
00038 ULong_t *me = (ULong_t *)fArray;
00039 ULong_t ret = fNWords;
00040
00041 ret = TMath::Hash(me,fNWords*sizeof(ULong_t));
00042
00043 return ret;
00044 }
00045 GtHash::~GtHash(){Delete(); if (fPoka) delete fPoka;};
00046
00047 void *GtHash::GetPointer(void *array,Int_t narray)
00048 {
00049 if (!fPoka || fPoka->fNWords!=narray) {
00050 if (fPoka) delete fPoka;
00051 fPoka = new GtCradle(narray);}
00052
00053 memcpy(fPoka->fArray,array,narray*sizeof(ULong_t));
00054
00055 fFound = (GtCradle*)FindObject(fPoka);
00056 if (!fFound) return 0;
00057 return fFound->fPointer;
00058 }
00059
00060 void GtHash::SetPointer(void *ptr)
00061 {
00062 assert (ptr);
00063 assert (!fFound);
00064 assert (fPoka);
00065 fPoka->fPointer = ptr;
00066 Add(fPoka);
00067 fPoka = 0;
00068 }
00069
00070 Int_t GtHash::GetNParams()
00071 { return (fFound) ? fFound->fNWords : 0 ; }
00072
00073 const void *GtHash::GetParams()
00074 { return (fFound) ? fFound->fArray : 0 ; }
00075
00076
00077
00078