#ifndef ROOT_TGeoBranchArray
#define ROOT_TGeoBranchArray
#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TGeoMatrix
#include "TGeoMatrix.h"
#endif
class TGeoNavigator;
class TGeoNode;
class TGeoBranchArray : public TObject
{
protected:
Int_t fLevel;
Int_t fMaxLevel;
TGeoHMatrix fMatrix;
TGeoNode **fArray;
TGeoNode *fRealArray[1];
private:
TGeoBranchArray(Int_t level);
TGeoBranchArray(const TGeoBranchArray&);
public:
enum EGeoBATypes {
kBASelfAlloc = BIT(14)
};
TGeoBranchArray(TRootIOCtor*) : TObject(), fLevel(0), fMaxLevel(0), fMatrix(), fArray(0) {}
static TGeoBranchArray *MakeInstance(size_t maxlevel);
static TGeoBranchArray *MakeInstanceAt(size_t maxlevel, void *addr);
static TGeoBranchArray *MakeCopy(const TGeoBranchArray &other);
static TGeoBranchArray *MakeCopyAt(const TGeoBranchArray &other, void *addr);
static void ReleaseInstance(TGeoBranchArray *obj);
TGeoBranchArray& operator=(const TGeoBranchArray&);
void CopyTo(TGeoBranchArray *dest);
static size_t SizeOf(size_t maxlevel)
{ return (sizeof(TGeoBranchArray)+sizeof(TGeoBranchArray*)*(maxlevel)); }
static size_t SizeOfInstance(size_t maxlevel)
{ return (sizeof(TGeoBranchArray)+sizeof(TGeoBranchArray*)*(maxlevel)); }
inline size_t SizeOf() const
{ return (sizeof(TGeoBranchArray)+sizeof(TGeoBranchArray*)*(fMaxLevel)); }
void *DataStart() const {return (void*)&fLevel;}
size_t DataSize() const {return SizeOf()-size_t(&fLevel)+(size_t)this;}
void UpdateArray(size_t nobj);
virtual ~TGeoBranchArray() {}
Bool_t operator ==(const TGeoBranchArray& other) const;
Bool_t operator !=(const TGeoBranchArray& other) const;
Bool_t operator >(const TGeoBranchArray& other) const;
Bool_t operator <(const TGeoBranchArray& other) const;
Bool_t operator >=(const TGeoBranchArray& other) const;
Bool_t operator <=(const TGeoBranchArray& other) const;
void AddLevel(Int_t dindex);
static Long64_t BinarySearch(Long64_t n, const TGeoBranchArray **array, TGeoBranchArray *value);
virtual Int_t Compare(const TObject *obj) const;
void CleanMatrix();
TGeoNode **GetArray() const {return fArray;}
size_t GetLevel() const {return fLevel;}
size_t GetMaxLevel() const {return fMaxLevel;}
const TGeoHMatrix
*GetMatrix() const {return &fMatrix;}
TGeoNode *GetNode(Int_t level) const {return fArray[level];}
TGeoNode *GetCurrentNode() const {return fArray[fLevel];}
void GetPath(TString &path) const;
void Init(TGeoNode **branch, TGeoMatrix *global, Int_t level);
void InitFromNavigator(TGeoNavigator *nav);
virtual Bool_t IsSortable() const {return kTRUE;}
Bool_t IsOutside() const {return (fLevel<0)?kTRUE:kFALSE;}
virtual void Print(Option_t *option="") const;
static void Sort(Int_t n, TGeoBranchArray **array, Int_t *index, Bool_t down=kTRUE);
void UpdateNavigator(TGeoNavigator *nav) const;
ClassDef(TGeoBranchArray, 4)
};
struct compareBAasc {
compareBAasc(TGeoBranchArray **d) : fData(d) {}
bool operator ()(Int_t i1, Int_t i2) {return **(fData+i1) < **(fData+i2);}
TGeoBranchArray **fData;
};
struct compareBAdesc {
compareBAdesc(TGeoBranchArray **d) : fData(d) {}
bool operator ()(Int_t i1, Int_t i2) {return **(fData+i1) > **(fData+i2);}
TGeoBranchArray **fData;
};
#endif