Пример #1
0
RBTree_Node *rtems_rbtree_compact_insert(
  RBTree_Control *the_rbtree,
  RBTree_Node    *the_node,
  RBTree_Compare  compare,
  bool            is_unique
)
{
  RBTree_Node *iter_node = the_rbtree->root;

  the_node->child[ RBT_LEFT ] = NULL;
  the_node->child[ RBT_RIGHT ] = NULL;

  if ( !iter_node ) { /* special case: first node inserted */
    the_rbtree->root = the_node;
    the_rbtree->first[ 0 ] = the_rbtree->first[ 1 ] = the_node;
    _RBTree_Set_parent_and_color(
      the_node,
      (RBTree_Node *) the_rbtree,
      RBT_BLACK
    );
  } else {
    /* typical binary search tree insert, descend tree to leaf and insert */
    while ( iter_node ) {
      RBTree_Compare_result compare_result =
        ( *compare )( the_node, iter_node );

      if ( is_unique && _RBTree_Is_equal( compare_result ) )
        return iter_node;

      RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );

      if ( !iter_node->child[ dir ] ) {
        _RBTree_Set_parent_and_color( the_node, iter_node, RBT_RED );
        iter_node->child[ dir ] = the_node;
        /* update min/max */
        compare_result = ( *compare )(
          the_node,
          _RBTree_First( the_rbtree, dir )
        );

        if (
          ( dir == RBT_LEFT && _RBTree_Is_lesser( compare_result ) )
            || ( dir == RBT_RIGHT && !_RBTree_Is_lesser( compare_result ) )
        ) {
          the_rbtree->first[ dir ] = the_node;
        }

        break;
      } else {
        iter_node = iter_node->child[ dir ];
      }
    } /* while(iter_node) */

    /* verify red-black properties */
    _RBTree_Validate_insert( the_node );
  }

  return (RBTree_Node *) 0;
}
Пример #2
0
static Thread_Control *_Thread_queue_Priority_first(
  Thread_queue_Heads *heads
)
{
  RBTree_Node *first;

  first = _RBTree_First( &heads->Heads.Priority, RBT_LEFT );

  return first != NULL ? THREAD_RBTREE_NODE_TO_THREAD( first ) : NULL;
}
Пример #3
0
void _RBTree_Iterate_unprotected(
  const RBTree_Control *rbtree,
  RBTree_Direction dir,
  RBTree_Visitor visitor,
  void *visitor_arg
)
{
  RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
  const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
  bool stop = false;

  while ( !stop && current != NULL ) {
    stop = (*visitor)( current, dir, visitor_arg );

    current = _RBTree_Next_unprotected( current, dir );
  }
}