summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/rbtree.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/include/rtems/score/rbtree.h')
-rw-r--r--cpukit/score/include/rtems/score/rbtree.h568
1 files changed, 0 insertions, 568 deletions
diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h
deleted file mode 100644
index 15a3bc8913..0000000000
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ /dev/null
@@ -1,568 +0,0 @@
-/**
- * @file rtems/score/rbtree.h
- *
- * @brief Constants and Structures Associated with the Red-Black Tree Handler
- *
- * This include file contains all the constants and structures associated
- * with the Red-Black Tree Handler.
- */
-
-/*
- * Copyright (c) 2010 Gedare Bloom.
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#ifndef _RTEMS_SCORE_RBTREE_H
-#define _RTEMS_SCORE_RBTREE_H
-
-#include <sys/tree.h>
-#include <rtems/score/basedefs.h>
-#include <rtems/score/assert.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup ScoreRBTree Red-Black Tree Handler
- *
- * @ingroup Score
- *
- * The Red-Black Tree Handler is used to manage sets of entities. This handler
- * provides two data structures. The rbtree Node data structure is included
- * as the first part of every data structure that will be placed on
- * a RBTree. The second data structure is rbtree Control which is used
- * to manage a set of rbtree Nodes.
- */
-/**@{*/
-
-struct RBTree_Control;
-
-/**
- * @brief Red-black tree node.
- *
- * This is used to manage each node (element) which is placed on a red-black
- * tree.
- */
-typedef struct RBTree_Node {
- RB_ENTRY(RBTree_Node) Node;
-} RBTree_Node;
-
-/**
- * @brief Red-black tree control.
- *
- * This is used to manage a red-black tree. A red-black tree consists of a
- * tree of zero or more nodes.
- */
-typedef RB_HEAD(RBTree_Control, RBTree_Node) RBTree_Control;
-
-/**
- * @brief Initializer for an empty red-black tree with designator @a name.
- */
-#define RBTREE_INITIALIZER_EMPTY( name ) \
- RB_INITIALIZER( name )
-
-/**
- * @brief Definition for an empty red-black tree with designator @a name.
- */
-#define RBTREE_DEFINE_EMPTY( name ) \
- RBTree_Control name = RBTREE_INITIALIZER_EMPTY( name )
-
-/**
- * @brief Sets a red-black tree node as off-tree.
- *
- * Do not use this function on nodes which are a part of a tree.
- *
- * @param[in] the_node The node to set off-tree.
- *
- * @see _RBTree_Is_node_off_tree().
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Set_off_tree( RBTree_Node *the_node )
-{
- RB_COLOR( the_node, Node ) = -1;
-}
-
-/**
- * @brief Returns true, if this red-black tree node is off-tree, and false
- * otherwise.
- *
- * @param[in] the_node The node to test.
- *
- * @retval true The node is not a part of a tree (off-tree).
- * @retval false Otherwise.
- *
- * @see _RBTree_Set_off_tree().
- */
-RTEMS_INLINE_ROUTINE bool _RBTree_Is_node_off_tree(
- const RBTree_Node *the_node
-)
-{
- return RB_COLOR( the_node, Node ) == -1;
-}
-
-/**
- * @brief Rebalances the red-black tree after insertion of the node.
- *
- * @param[in] the_rbtree The red-black tree control.
- * @param[in] the_node The most recently inserted node.
- */
-void _RBTree_Insert_color(
- RBTree_Control *the_rbtree,
- RBTree_Node *the_node
-);
-
-/**
- * @brief Initializes a red-black tree node.
- *
- * In debug configurations, the node is set off tree. In all other
- * configurations, this function does nothing.
- *
- * @param[in] the_node The red-black tree node to initialize.
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Initialize_node( RBTree_Node *the_node )
-{
-#if defined(RTEMS_DEBUG)
- _RBTree_Set_off_tree( the_node );
-#else
- (void) the_node;
-#endif
-}
-
-/**
- * @brief Adds a child node to a parent node.
- *
- * @param[in] child The child node.
- * @param[in] parent The parent node.
- * @param[in] link The child node link of the parent node.
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Add_child(
- RBTree_Node *child,
- RBTree_Node *parent,
- RBTree_Node **link
-)
-{
- _Assert( _RBTree_Is_node_off_tree( child ) );
- RB_SET( child, parent, Node );
- *link = child;
-}
-
-/**
- * @brief Inserts the node into the red-black tree using the specified parent
- * node and link.
- *
- * @param[in] the_rbtree The red-black tree control.
- * @param[in] the_node The node to insert.
- * @param[in] parent The parent node.
- * @param[in] link The child node link of the parent node.
- *
- * @code
- * #include <rtems/score/rbtree.h>
- *
- * typedef struct {
- * int value;
- * RBTree_Node Node;
- * } Some_Node;
- *
- * bool _Some_Less(
- * const RBTree_Node *a,
- * const RBTree_Node *b
- * )
- * {
- * const Some_Node *aa = RTEMS_CONTAINER_OF( a, Some_Node, Node );
- * const Some_Node *bb = RTEMS_CONTAINER_OF( b, Some_Node, Node );
- *
- * return aa->value < bb->value;
- * }
- *
- * void _Some_Insert(
- * RBTree_Control *the_rbtree,
- * Some_Node *the_node
- * )
- * {
- * RBTree_Node **link = _RBTree_Root_reference( the_rbtree );
- * RBTree_Node *parent = NULL;
- *
- * while ( *link != NULL ) {
- * parent = *link;
- *
- * if ( _Some_Less( &the_node->Node, parent ) ) {
- * link = _RBTree_Left_reference( parent );
- * } else {
- * link = _RBTree_Right_reference( parent );
- * }
- * }
- *
- * _RBTree_Insert_with_parent( the_rbtree, &the_node->Node, parent, link );
- * }
- * @endcode
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Insert_with_parent(
- RBTree_Control *the_rbtree,
- RBTree_Node *the_node,
- RBTree_Node *parent,
- RBTree_Node **link
-)
-{
- _RBTree_Add_child( the_node, parent, link );
- _RBTree_Insert_color( the_rbtree, the_node );
-}
-
-/**
- * @brief Extracts (removes) the node from the red-black tree.
- *
- * This function does not set the node off-tree. In case this is desired, then
- * call _RBTree_Set_off_tree() after the extraction.
- *
- * In case the node to extract is not a node of the tree, then this function
- * yields unpredictable results.
- *
- * @param[in] the_rbtree The red-black tree control.
- * @param[in] the_node The node to extract.
- */
-void _RBTree_Extract(
- RBTree_Control *the_rbtree,
- RBTree_Node *the_node
-);
-
-/**
- * @brief Returns a pointer to root node of the red-black tree.
- *
- * The root node may change after insert or extract operations.
- *
- * @param[in] the_rbtree The red-black tree control.
- *
- * @retval NULL The tree is empty.
- * @retval root The root node.
- *
- * @see _RBTree_Is_root().
- */
-RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Root(
- const RBTree_Control *the_rbtree
-)
-{
- return RB_ROOT( the_rbtree );
-}
-
-/**
- * @brief Returns a reference to the root pointer of the red-black tree.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node **_RBTree_Root_reference(
- RBTree_Control *the_rbtree
-)
-{
- return &RB_ROOT( the_rbtree );
-}
-
-/**
- * @brief Returns a constant reference to the root pointer of the red-black tree.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node * const *_RBTree_Root_const_reference(
- const RBTree_Control *the_rbtree
-)
-{
- return &RB_ROOT( the_rbtree );
-}
-
-/**
- * @brief Returns a pointer to the parent of this node.
- *
- * The node must have a parent, thus it is invalid to use this function for the
- * root node or a node that is not part of a tree. To test for the root node
- * compare with _RBTree_Root() or use _RBTree_Is_root().
- *
- * @param[in] the_node The node of interest.
- *
- * @retval parent The parent of this node.
- * @retval undefined The node is the root node or not part of a tree.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Parent(
- const RBTree_Node *the_node
-)
-{
- return RB_PARENT( the_node, Node );
-}
-
-/**
- * @brief Return pointer to the left of this node.
- *
- * This function returns a pointer to the left node of this node.
- *
- * @param[in] the_node is the node to be operated upon.
- *
- * @return This method returns the left node on the rbtree.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Left(
- const RBTree_Node *the_node
-)
-{
- return RB_LEFT( the_node, Node );
-}
-
-/**
- * @brief Returns a reference to the left child pointer of the red-black tree
- * node.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node **_RBTree_Left_reference(
- RBTree_Node *the_node
-)
-{
- return &RB_LEFT( the_node, Node );
-}
-
-/**
- * @brief Return pointer to the right of this node.
- *
- * This function returns a pointer to the right node of this node.
- *
- * @param[in] the_node is the node to be operated upon.
- *
- * @return This method returns the right node on the rbtree.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Right(
- const RBTree_Node *the_node
-)
-{
- return RB_RIGHT( the_node, Node );
-}
-
-/**
- * @brief Returns a reference to the right child pointer of the red-black tree
- * node.
- */
-RTEMS_INLINE_ROUTINE RBTree_Node **_RBTree_Right_reference(
- RBTree_Node *the_node
-)
-{
- return &RB_RIGHT( the_node, Node );
-}
-
-/**
- * @brief Is the RBTree empty.
- *
- * This function returns true if there are no nodes on @a the_rbtree and
- * false otherwise.
- *
- * @param[in] the_rbtree is the rbtree to be operated upon.
- *
- * @retval true There are no nodes on @a the_rbtree.
- * @retval false There are nodes on @a the_rbtree.
- */
-RTEMS_INLINE_ROUTINE bool _RBTree_Is_empty(
- const RBTree_Control *the_rbtree
-)
-{
- return RB_EMPTY( the_rbtree );
-}
-
-/**
- * @brief Returns true if this node is the root node of a red-black tree, and
- * false otherwise.
- *
- * The root node may change after insert or extract operations. In case the
- * node is not a node of a tree, then this function yields unpredictable
- * results.
- *
- * @param[in] the_node The node of interest.
- *
- * @retval true The node is the root node.
- * @retval false Otherwise.
- *
- * @see _RBTree_Root().
- */
-RTEMS_INLINE_ROUTINE bool _RBTree_Is_root(
- const RBTree_Node *the_node
-)
-{
- return _RBTree_Parent( the_node ) == NULL;
-}
-
-/**
- * @brief Initialize this RBTree as empty.
- *
- * This routine initializes @a the_rbtree to contain zero nodes.
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Initialize_empty(
- RBTree_Control *the_rbtree
-)
-{
- RB_INIT( the_rbtree );
-}
-
-/**
- * @brief Initializes this red-black tree to contain exactly the specified
- * node.
- *
- * @param[in] the_rbtree The red-black tree control.
- * @param[in] the_node The one and only node.
- */
-RTEMS_INLINE_ROUTINE void _RBTree_Initialize_one(
- RBTree_Control *the_rbtree,
- RBTree_Node *the_node
-)
-{
- _Assert( _RBTree_Is_node_off_tree( the_node ) );
- RB_ROOT( the_rbtree ) = the_node;
- RB_PARENT( the_node, Node ) = NULL;
- RB_LEFT( the_node, Node ) = NULL;
- RB_RIGHT( the_node, Node ) = NULL;
- RB_COLOR( the_node, Node ) = RB_BLACK;
-}
-
-/**
- * @brief Returns the minimum node of the red-black tree.
- *
- * @param[in] the_rbtree The red-black tree control.
- *
- * @retval NULL The red-black tree is empty.
- * @retval node The minimum node.
- */
-RBTree_Node *_RBTree_Minimum( const RBTree_Control *the_rbtree );
-
-/**
- * @brief Returns the maximum node of the red-black tree.
- *
- * @param[in] the_rbtree The red-black tree control.
- *
- * @retval NULL The red-black tree is empty.
- * @retval node The maximum node.
- */
-RBTree_Node *_RBTree_Maximum( const RBTree_Control *the_rbtree );
-
-/**
- * @brief Returns the predecessor of a node.
- *
- * @param[in] node is the node.
- *
- * @retval NULL The predecessor does not exist. Otherwise it returns
- * the predecessor node.
- */
-RBTree_Node *_RBTree_Predecessor( const RBTree_Node *node );
-
-/**
- * @brief Returns the successor of a node.
- *
- * @param[in] node is the node.
- *
- * @retval NULL The successor does not exist. Otherwise the successor node.
- */
-RBTree_Node *_RBTree_Successor( const RBTree_Node *node );
-
-/**
- * @brief Replaces a node in the red-black tree without a rebalance.
- *
- * @param[in] the_rbtree The red-black tree control.
- * @param[in] victim The victim node.
- * @param[in] replacement The replacement node.
- */
-void _RBTree_Replace_node(
- RBTree_Control *the_rbtree,
- RBTree_Node *victim,
- RBTree_Node *replacement
-);
-
-/**
- * @brief Inserts the node into the red-black tree.
- *
- * @param the_rbtree The red-black tree control.
- * @param the_node The node to insert.
- * @param key The key of the node to insert. This key must be equal to the key
- * stored in the node to insert. The separate key parameter is provided for
- * two reasons. Firstly, it allows to share the less operator with
- * _RBTree_Find_inline(). Secondly, the compiler may generate better code if
- * the key is stored in a local variable.
- * @param less Must return true if the specified key is less than the key of
- * the node, otherwise false.
- *
- * @retval true The inserted node is the new minimum node according to the
- * specified less order function.
- * @retval false Otherwise.
- */
-RTEMS_INLINE_ROUTINE bool _RBTree_Insert_inline(
- RBTree_Control *the_rbtree,
- RBTree_Node *the_node,
- const void *key,
- bool ( *less )( const void *, const RBTree_Node * )
-)
-{
- RBTree_Node **link;
- RBTree_Node *parent;
- bool is_new_minimum;
-
- link = _RBTree_Root_reference( the_rbtree );
- parent = NULL;
- is_new_minimum = true;
-
- while ( *link != NULL ) {
- parent = *link;
-
- if ( ( *less )( key, parent ) ) {
- link = _RBTree_Left_reference( parent );
- } else {
- link = _RBTree_Right_reference( parent );
- is_new_minimum = false;
- }
- }
-
- _RBTree_Add_child( the_node, parent, link );
- _RBTree_Insert_color( the_rbtree, the_node );
- return is_new_minimum;
-}
-
-/**
- * @brief Finds an object in the red-black tree with the specified key.
- *
- * @param the_rbtree The red-black tree control.
- * @param key The key to look after.
- * @param equal Must return true if the specified key equals the key of the
- * node, otherwise false.
- * @param less Must return true if the specified key is less than the key of
- * the node, otherwise false.
- * @param map In case a node with the specified key is found, then this
- * function is called to map the node to the object returned. Usually it
- * performs some offset operation via RTEMS_CONTAINER_OF() to map the node to
- * its containing object. Thus, the return type is a void pointer and not a
- * red-black tree node.
- *
- * @retval object An object with the specified key.
- * @retval NULL No object with the specified key exists in the red-black tree.
- */
-RTEMS_INLINE_ROUTINE void *_RBTree_Find_inline(
- const RBTree_Control *the_rbtree,
- const void *key,
- bool ( *equal )( const void *, const RBTree_Node * ),
- bool ( *less )( const void *, const RBTree_Node * ),
- void *( *map )( RBTree_Node * )
-)
-{
- RBTree_Node * const *link;
- RBTree_Node *parent;
-
- link = _RBTree_Root_const_reference( the_rbtree );
- parent = NULL;
-
- while ( *link != NULL ) {
- parent = *link;
-
- if ( ( *equal )( key, parent ) ) {
- return ( *map )( parent );
- } else if ( ( *less )( key, parent ) ) {
- link = _RBTree_Left_reference( parent );
- } else {
- link = _RBTree_Right_reference( parent );
- }
- }
-
- return NULL;
-}
-
-/**@}*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-/* end of include file */