/* Copyright (C) 2021 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ // // The Persistent Red-Black Tree // #ifndef _PRBTREE_H #define _PRBTREE_H #include "dbe_types.h" template class Vector; // The number of pointers in a node must be set greater than 2. // The higher the number the faster the search seems to be and // the more memory the tree takes. #define NPTRS 5 class PRBTree { public: typedef Vaddr Key_t; typedef hrtime_t Time_t; PRBTree (); ~PRBTree (); bool insert (Key_t key, Time_t ts, void *item); bool remove (Key_t key, Time_t ts); void *locate (Key_t key, Time_t ts); void *locate_exact_match (Key_t key, Time_t ts); void *locate_up (Key_t key, Time_t ts); Vector *values (); private: enum Color { Red, Black }; enum Direction { None, Left, Right }; struct LMap { Key_t key; void *item; LMap *parent; LMap *chld[NPTRS]; Time_t time[NPTRS]; char dir[NPTRS]; char color; LMap *next; LMap (Key_t _key, void *_item); LMap (const LMap& lm); }; friend struct LMap; LMap *mlist; // The master list of all nodes Vector *roots; Vector *times; Vector *vals; LMap *root; Time_t rtts; // root timestamp Time_t curts; // last update timestamp LMap *rb_locate (Key_t key, Time_t ts, bool low); LMap *rb_new_node (Key_t key, void *item); LMap *rb_new_node (LMap *lm); LMap *rb_copy_node (LMap *lm, Direction d); LMap *rb_fix_chld (LMap *prnt, LMap *lm, Direction d); LMap *rb_rotate (LMap *x, Direction d); void rb_remove_fixup (LMap *x, LMap *prnt, Direction d0); static LMap *rb_child (LMap *lm, Direction d, Time_t ts); static Direction rb_which_chld (LMap *lm); static LMap *rb_neighbor (LMap *lm, Time_t ts); }; #endif /* _PRBTREE_H */