score: Move _RBTree_Find()

The _RBTree_Find() is no longer used in the score.  Move it to sapi and
make it rtems_rbtree_find().  Move corresponding types and support
functions to sapi.
This commit is contained in:
Sebastian Huber
2016-06-17 07:50:01 +02:00
parent 768c483b70
commit 69a6802bfa
8 changed files with 121 additions and 142 deletions

View File

@@ -40,6 +40,7 @@ libsapi_a_SOURCES += src/cpucounterconverter.c
libsapi_a_SOURCES += src/delayticks.c
libsapi_a_SOURCES += src/delaynano.c
libsapi_a_SOURCES += src/rbtree.c
libsapi_a_SOURCES += src/rbtreefind.c
libsapi_a_SOURCES += src/rbtreeinsert.c
libsapi_a_SOURCES += src/profilingiterate.c
libsapi_a_SOURCES += src/profilingreportxml.c

View File

@@ -55,14 +55,31 @@ typedef RBTree_Node rtems_rbtree_node;
typedef RBTree_Control rtems_rbtree_control;
/**
* @copydoc RBTree_Compare_result
* @brief Integer type for compare results.
*
* The type is large enough to represent pointers and 32-bit signed integers.
*
* @see rtems_rbtree_compare.
*/
typedef RBTree_Compare_result rtems_rbtree_compare_result;
typedef long rtems_rbtree_compare_result;
/**
* @copydoc RBTree_Compare
* @brief Compares two red-black tree nodes.
*
* @param[in] first The first node.
* @param[in] second The second node.
*
* @retval positive The key value of the first node is greater than the one of
* the second node.
* @retval 0 The key value of the first node is equal to the one of the second
* node.
* @retval negative The key value of the first node is less than the one of the
* second node.
*/
typedef RBTree_Compare rtems_rbtree_compare;
typedef rtems_rbtree_compare_result ( *rtems_rbtree_compare )(
const RBTree_Node *first,
const RBTree_Node *second
);
/**
* @brief RBTree initializer for an empty rbtree with designator @a name.
@@ -255,19 +272,48 @@ RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_root(
return _RBTree_Is_root( the_node );
}
/**
* @copydoc _RBTree_Find()
*/
RTEMS_INLINE_ROUTINE rtems_rbtree_node* rtems_rbtree_find(
const rtems_rbtree_control *the_rbtree,
const rtems_rbtree_node *the_node,
rtems_rbtree_compare compare,
bool is_unique
RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_equal(
rtems_rbtree_compare_result compare_result
)
{
return _RBTree_Find( the_rbtree, the_node, compare, is_unique );
return compare_result == 0;
}
RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_greater(
rtems_rbtree_compare_result compare_result
)
{
return compare_result > 0;
}
RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_lesser(
rtems_rbtree_compare_result compare_result
)
{
return compare_result < 0;
}
/**
* @brief Tries to find a node for the specified key in the tree.
*
* @param[in] the_rbtree The red-black tree control.
* @param[in] the_node A node specifying the key.
* @param[in] compare The node compare function.
* @param[in] is_unique If true, then return the first node with a key equal to
* the one of the node specified if it exits, else return the last node if it
* exists.
*
* @retval node A node corresponding to the key. If the tree is not unique
* and contains duplicate keys, the set of duplicate keys acts as FIFO.
* @retval NULL No node exists in the tree for the key.
*/
rtems_rbtree_node* rtems_rbtree_find(
const rtems_rbtree_control *the_rbtree,
const rtems_rbtree_node *the_node,
rtems_rbtree_compare compare,
bool is_unique
);
/**
* @copydoc _RBTree_Predecessor()
*/
@@ -396,7 +442,7 @@ RTEMS_INLINE_ROUTINE rtems_rbtree_node *rtems_rbtree_peek_max(
rtems_rbtree_node *rtems_rbtree_insert(
RBTree_Control *the_rbtree,
RBTree_Node *the_node,
RBTree_Compare compare,
rtems_rbtree_compare compare,
bool is_unique
);

View File

@@ -0,0 +1,51 @@
/**
* @file
*
* @brief Find the control structure of the tree containing the given node
* @ingroup Scorertems_rbtree
*/
/*
* 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.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/rbtree.h>
rtems_rbtree_node *rtems_rbtree_find(
const rtems_rbtree_control *the_rbtree,
const rtems_rbtree_node *the_node,
rtems_rbtree_compare compare,
bool is_unique
)
{
rtems_rbtree_node *iter_node = rtems_rbtree_root( the_rbtree );
rtems_rbtree_node *found = NULL;
while ( iter_node != NULL ) {
rtems_rbtree_compare_result compare_result =
( *compare )( the_node, iter_node );
if ( rtems_rbtree_is_equal( compare_result ) ) {
found = iter_node;
if ( is_unique )
break;
}
if ( rtems_rbtree_is_greater( compare_result ) ) {
iter_node = rtems_rbtree_right( iter_node );
} else {
iter_node = rtems_rbtree_left( iter_node );
}
}
return found;
}

View File

@@ -14,19 +14,19 @@
#include <rtems/score/rbtreeimpl.h>
RTEMS_STATIC_ASSERT(
sizeof( RBTree_Compare_result ) >= sizeof( intptr_t ),
RBTree_Compare_result_intptr_t
sizeof( rtems_rbtree_compare_result ) >= sizeof( intptr_t ),
rtems_rbtree_compare_result_intptr_t
);
RTEMS_STATIC_ASSERT(
sizeof( RBTree_Compare_result ) >= sizeof( int32_t ),
RBTree_Compare_result_int32_t
sizeof( rtems_rbtree_compare_result ) >= sizeof( int32_t ),
rtems_rbtree_compare_result_int32_t
);
rtems_rbtree_node *rtems_rbtree_insert(
rtems_rbtree_control *the_rbtree,
rtems_rbtree_node *the_node,
RBTree_Compare compare,
rtems_rbtree_compare compare,
bool is_unique
)
{
@@ -34,16 +34,16 @@ rtems_rbtree_node *rtems_rbtree_insert(
rtems_rbtree_node *parent = NULL;
while ( *which != NULL ) {
RBTree_Compare_result compare_result;
rtems_rbtree_compare_result compare_result;
parent = *which;
compare_result = ( *compare )( the_node, parent );
if ( is_unique && _RBTree_Is_equal( compare_result ) ) {
if ( is_unique && rtems_rbtree_is_equal( compare_result ) ) {
return parent;
}
if ( _RBTree_Is_lesser( compare_result ) ) {
if ( rtems_rbtree_is_lesser( compare_result ) ) {
which = _RBTree_Left_reference( parent );
} else {
which = _RBTree_Right_reference( parent );

View File

@@ -292,7 +292,7 @@ libscore_a_SOURCES += src/freechain.c
## RBTREE_C_FILES
libscore_a_SOURCES += \
src/rbtreeextract.c src/rbtreefind.c \
src/rbtreeextract.c \
src/rbtreeinsert.c src/rbtreeiterate.c src/rbtreenext.c
libscore_a_SOURCES += src/rbtreereplace.c

View File

@@ -56,33 +56,6 @@ typedef struct RBTree_Node {
*/
typedef RB_HEAD(RBTree_Control, RBTree_Node) RBTree_Control;
/**
* @brief Integer type for compare results.
*
* The type is large enough to represent pointers and 32-bit signed integers.
*
* @see RBTree_Compare.
*/
typedef long RBTree_Compare_result;
/**
* @brief Compares two red-black tree nodes.
*
* @param[in] first The first node.
* @param[in] second The second node.
*
* @retval positive The key value of the first node is greater than the one of
* the second node.
* @retval 0 The key value of the first node is equal to the one of the second
* node.
* @retval negative The key value of the first node is less than the one of the
* second node.
*/
typedef RBTree_Compare_result ( *RBTree_Compare )(
const RBTree_Node *first,
const RBTree_Node *second
);
/**
* @brief Initializer for an empty red-black tree with designator @a name.
*/
@@ -95,27 +68,6 @@ typedef RBTree_Compare_result ( *RBTree_Compare )(
#define RBTREE_DEFINE_EMPTY( name ) \
RBTree_Control name = RBTREE_INITIALIZER_EMPTY( name )
/**
* @brief Tries to find a node for the specified key in the tree.
*
* @param[in] the_rbtree The red-black tree control.
* @param[in] the_node A node specifying the key.
* @param[in] compare The node compare function.
* @param[in] is_unique If true, then return the first node with a key equal to
* the one of the node specified if it exits, else return the last node if it
* exists.
*
* @retval node A node corresponding to the key. If the tree is not unique
* and contains duplicate keys, the set of duplicate keys acts as FIFO.
* @retval NULL No node exists in the tree for the key.
*/
RBTree_Node *_RBTree_Find(
const RBTree_Control *the_rbtree,
const RBTree_Node *the_node,
RBTree_Compare compare,
bool is_unique
);
/**
* @brief Rebalances the red-black tree after insertion of the node.
*

View File

@@ -62,27 +62,6 @@ void _RBTree_Iterate(
void *visitor_arg
);
RTEMS_INLINE_ROUTINE bool _RBTree_Is_equal(
RBTree_Compare_result compare_result
)
{
return compare_result == 0;
}
RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
RBTree_Compare_result compare_result
)
{
return compare_result > 0;
}
RTEMS_INLINE_ROUTINE bool _RBTree_Is_lesser(
RBTree_Compare_result compare_result
)
{
return compare_result < 0;
}
/** @} */
#ifdef __cplusplus

View File

@@ -1,50 +0,0 @@
/**
* @file
*
* @brief Find the control structure of the tree containing the given node
* @ingroup ScoreRBTree
*/
/*
* 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.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/rbtreeimpl.h>
RBTree_Node *_RBTree_Find(
const RBTree_Control *the_rbtree,
const RBTree_Node *the_node,
RBTree_Compare compare,
bool is_unique
)
{
RBTree_Node *iter_node = _RBTree_Root( the_rbtree );
RBTree_Node *found = NULL;
while ( iter_node != NULL ) {
RBTree_Compare_result compare_result = ( *compare )( the_node, iter_node );
if ( _RBTree_Is_equal( compare_result ) ) {
found = iter_node;
if ( is_unique )
break;
}
if ( _RBTree_Is_greater( compare_result ) ) {
iter_node = _RBTree_Right( iter_node );
} else {
iter_node = _RBTree_Left( iter_node );
}
}
return found;
}