38 class TBtree :
public TSeqCollection {
41 friend class TBtInnerNode;
42 friend class TBtLeafNode;
50 Int_t fInnerLowWaterMark;
51 Int_t fLeafLowWaterMark;
60 void IncrNofKeys() { fSize++; }
61 void DecrNofKeys() { fSize--; }
66 Int_t IdxAdd(
const TObject &obj);
69 typedef TBtreeIter Iterator_t;
71 TBtree(Int_t ordern = 3);
73 void Clear(Option_t *option=
"");
74 void Delete(Option_t *option=
"");
75 TObject *FindObject(
const char *name)
const;
76 TObject *FindObject(
const TObject *obj)
const;
77 TObject **GetObjectRef(
const TObject *)
const {
return 0; }
78 TIterator *MakeIterator(Bool_t dir = kIterForward)
const;
80 void Add(TObject *obj);
81 void AddFirst(TObject *obj) { Add(obj); }
82 void AddLast(TObject *obj) { Add(obj); }
83 void AddAt(TObject *obj, Int_t) { Add(obj); }
84 void AddAfter(
const TObject *, TObject *obj) { Add(obj); }
85 void AddBefore(
const TObject *, TObject *obj) { Add(obj); }
86 TObject *Remove(TObject *obj);
88 TObject *At(Int_t idx)
const;
89 TObject *Before(
const TObject *obj)
const;
90 TObject *After(
const TObject *obj)
const;
91 TObject *First()
const;
92 TObject *Last()
const;
96 Int_t Order() {
return fOrder; }
97 TObject *operator[](Int_t i)
const;
98 Int_t Rank(
const TObject *obj)
const;
115 friend class TBtInnerNode;
116 friend class TBtLeafNode;
124 TBtInnerNode *fParent;
129 TBtNode(Int_t isleaf, TBtInnerNode *p, TBtree *t = 0);
132 virtual void Add(
const TObject *obj, Int_t index) = 0;
134 virtual TBtree *GetParentTree()
const {
return fTree;}
135 virtual void Remove(Int_t index) = 0;
137 virtual TObject *operator[](Int_t i)
const = 0;
138 virtual TObject *Found(
const TObject *obj, TBtNode **which, Int_t *where) = 0;
140 virtual Int_t FindRank(
const TObject *obj)
const = 0;
141 virtual Int_t NofKeys()
const = 0;
143 virtual TBtLeafNode *FirstLeafNode() = 0;
144 virtual TBtLeafNode *LastLeafNode() = 0;
146 virtual void Split() = 0;
163 friend class TBtInnerNode;
166 Int_t fNofKeysInTree;
172 TBtItem(TBtNode *n, TObject *o);
173 TBtItem(TObject *o, TBtNode *n);
186 class TBtInnerNode :
public TBtNode {
192 TBtInnerNode(TBtInnerNode *parent, TBtree *t = 0);
193 TBtInnerNode(TBtInnerNode *parent, TBtree *tree, TBtNode *oldroot);
197 void Add(
const TObject *obj, Int_t idx);
198 void Add(TBtItem &i, Int_t idx);
199 void Add(Int_t at, TObject *obj, TBtNode *n);
200 void AddElt(TBtItem &itm, Int_t at);
201 void AddElt(Int_t at, TObject *obj, TBtNode *n);
202 void Remove(Int_t idx);
203 void RemoveItem(Int_t idx);
205 TObject *operator[](Int_t i)
const;
206 TObject *Found(
const TObject *obj, TBtNode **which, Int_t *where);
208 Int_t NofKeys(Int_t idx)
const;
209 Int_t NofKeys()
const;
210 void SetTree(Int_t i, TBtNode *node) { fItem[i].fTree = node; node->fParent =
this; }
211 void SetKey(Int_t i, TObject *obj) { fItem[i].fKey = obj; }
212 void SetItem(Int_t i, TBtItem &itm) { fItem[i] = itm; itm.fTree->fParent =
this; }
213 void SetItem(Int_t i, TObject *obj, TBtNode *node) { SetTree(i, node); SetKey(i, obj); }
214 Int_t GetNofKeys(Int_t i)
const;
215 void SetNofKeys(Int_t i, Int_t r);
216 Int_t IncNofKeys(Int_t i, Int_t n=1);
217 Int_t DecNofKeys(Int_t i, Int_t n=1);
218 Int_t FindRank(
const TObject *obj)
const;
219 Int_t FindRankUp(
const TBtNode *n)
const;
220 TBtNode *GetTree(Int_t i)
const {
return fItem[i].fTree; }
221 TObject *GetKey(Int_t i)
const {
return fItem[i].fKey; }
222 TBtItem &GetItem(Int_t i)
const {
return fItem[i]; }
224 Int_t IndexOf(
const TBtNode *n)
const;
225 void IncrNofKeys(TBtNode *np);
226 void DecrNofKeys(TBtNode *np);
228 TBtLeafNode *FirstLeafNode();
229 TBtLeafNode *LastLeafNode();
234 void SplitWith(TBtInnerNode *r, Int_t idx);
235 void MergeWithRight(TBtInnerNode *r, Int_t idx);
236 void BalanceWithLeft(TBtInnerNode *l, Int_t idx);
237 void BalanceWithRight(TBtInnerNode *r, Int_t idx);
238 void BalanceWith(TBtInnerNode *n,
int idx);
239 void PushLeft(Int_t cnt, TBtInnerNode *leftsib, Int_t parentIdx);
240 void PushRight(Int_t cnt, TBtInnerNode *rightsib, Int_t parentIdx);
241 void AppendFrom(TBtInnerNode *src, Int_t start, Int_t stop);
242 void Append(TObject *obj, TBtNode *n);
243 void Append(TBtItem &itm);
244 void ShiftLeft(Int_t cnt);
246 Int_t Psize()
const {
return fLast; }
248 Int_t MaxIndex()
const {
return fTree->fInnerMaxIndex; }
249 Int_t MaxPsize()
const {
return fTree->fInnerMaxIndex; }
253 Int_t IsFull()
const {
return fLast == MaxIndex(); }
254 void IsFull(TBtNode *n);
255 Int_t IsAlmostFull()
const {
return fLast >= MaxIndex() - 1; }
256 Int_t IsLow()
const {
return fLast < fTree->fInnerLowWaterMark; }
257 void IsLow(TBtNode *n);
270 class TBtLeafNode :
public TBtNode {
272 friend class TBtInnerNode;
278 TBtLeafNode(TBtInnerNode *p,
const TObject *obj = 0, TBtree *t = 0);
282 void Add(
const TObject *obj, Int_t idx);
283 void Remove(Int_t idx);
284 void RemoveItem(Int_t idx) { Remove(idx); }
286 TObject *operator[](Int_t i)
const;
287 TObject *Found(
const TObject *obj, TBtNode **which, Int_t *where);
289 Int_t NofKeys(Int_t i)
const;
290 Int_t NofKeys()
const;
291 Int_t FindRank(
const TObject *obj)
const;
292 TObject *GetKey(Int_t idx ) {
return fItem[idx]; }
293 void SetKey(Int_t idx, TObject *obj) { fItem[idx] = obj; }
295 Int_t IndexOf(
const TObject *obj)
const;
297 TBtLeafNode *FirstLeafNode();
298 TBtLeafNode *LastLeafNode();
301 void SplitWith(TBtLeafNode *r, Int_t idx);
302 void MergeWithRight(TBtLeafNode *r, Int_t idx);
303 void BalanceWithLeft(TBtLeafNode *l, Int_t idx);
304 void BalanceWithRight(TBtLeafNode *r, Int_t idx);
305 void BalanceWith(TBtLeafNode *n, Int_t idx);
306 void PushLeft(Int_t cnt, TBtLeafNode *l, Int_t parentIndex);
307 void PushRight(Int_t cnt, TBtLeafNode *r, Int_t parentIndex);
308 void AppendFrom(TBtLeafNode *src, Int_t start, Int_t stop);
309 void Append(TObject *obj);
310 void ShiftLeft(Int_t cnt);
312 Int_t Psize()
const {
return fLast + 1; }
314 Int_t MaxIndex()
const {
return fTree->fLeafMaxIndex; }
315 Int_t MaxPsize()
const {
return fTree->fLeafMaxIndex + 1; }
319 Int_t IsFull()
const {
return fLast == MaxIndex(); }
320 Int_t IsAlmostFull()
const {
return fLast >= MaxIndex() - 1; }
321 Int_t IsLow()
const {
return fLast < fTree->fLeafLowWaterMark; }
334 class TBtreeIter :
public TIterator,
335 public std::iterator<std::bidirectional_iterator_tag,
336 TObject*, std::ptrdiff_t,
337 const TObject**, const TObject*&> {
345 TBtreeIter() : fTree(0), fCurCursor(0), fCursor(0), fDirection(kIterForward) { }
348 TBtreeIter(
const TBtree *t, Bool_t dir = kIterForward);
349 TBtreeIter(
const TBtreeIter &iter);
351 TIterator &operator=(
const TIterator &rhs);
352 TBtreeIter &operator=(
const TBtreeIter &rhs);
354 const TCollection *GetCollection()
const {
return fTree; }
357 Bool_t operator!=(
const TIterator &aIter)
const;
358 Bool_t operator!=(
const TBtreeIter &aIter)
const;
359 TObject *operator*()
const;
361 ClassDef(TBtreeIter,0)
367 inline TObject *TBtree::operator[](Int_t i)
const
372 inline TObject *TBtree::At(Int_t i)
const
377 inline TObject *TBtree::First()
const
382 inline TObject *TBtree::Last()
const
384 return (*fRoot)[fSize-1];
389 inline Int_t TBtInnerNode::GetNofKeys(Int_t i)
const
391 R__ASSERT(i >= 0 && i <= fLast);
392 return fItem[i].fNofKeysInTree;
395 inline Int_t TBtInnerNode::NofKeys(Int_t idx)
const
397 return GetNofKeys(idx);
400 inline void TBtInnerNode::SetNofKeys(Int_t i, Int_t r)
402 fItem[i].fNofKeysInTree = r;
405 inline Int_t TBtInnerNode::IncNofKeys(Int_t i, Int_t n)
407 return (fItem[i].fNofKeysInTree += n);
410 inline Int_t TBtInnerNode::DecNofKeys(Int_t i, Int_t n)
412 return (fItem[i].fNofKeysInTree -= n);
415 inline Int_t TBtInnerNode::Vsize()
const
417 R__ASSERT(fParent != 0 && fParent->GetTree(0) != (
const TBtNode *)
this);
424 inline TObject *TBtLeafNode::operator[](Int_t i)
const
426 R__ASSERT(i >= 0 && i <= fLast);
430 inline Int_t TBtLeafNode::Vsize()
const
432 R__ASSERT(fParent != 0 && fParent->GetTree(0) != (
const TBtNode *)
this);