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/delayticks.c
libsapi_a_SOURCES += src/delaynano.c libsapi_a_SOURCES += src/delaynano.c
libsapi_a_SOURCES += src/rbtree.c libsapi_a_SOURCES += src/rbtree.c
libsapi_a_SOURCES += src/rbtreefind.c
libsapi_a_SOURCES += src/rbtreeinsert.c libsapi_a_SOURCES += src/rbtreeinsert.c
libsapi_a_SOURCES += src/profilingiterate.c libsapi_a_SOURCES += src/profilingiterate.c
libsapi_a_SOURCES += src/profilingreportxml.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; 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. * @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 ); return _RBTree_Is_root( the_node );
} }
/** RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_equal(
* @copydoc _RBTree_Find() rtems_rbtree_compare_result compare_result
*/
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
) )
{ {
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() * @copydoc _RBTree_Predecessor()
*/ */
@@ -396,7 +442,7 @@ RTEMS_INLINE_ROUTINE rtems_rbtree_node *rtems_rbtree_peek_max(
rtems_rbtree_node *rtems_rbtree_insert( rtems_rbtree_node *rtems_rbtree_insert(
RBTree_Control *the_rbtree, RBTree_Control *the_rbtree,
RBTree_Node *the_node, RBTree_Node *the_node,
RBTree_Compare compare, rtems_rbtree_compare compare,
bool is_unique 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> #include <rtems/score/rbtreeimpl.h>
RTEMS_STATIC_ASSERT( RTEMS_STATIC_ASSERT(
sizeof( RBTree_Compare_result ) >= sizeof( intptr_t ), sizeof( rtems_rbtree_compare_result ) >= sizeof( intptr_t ),
RBTree_Compare_result_intptr_t rtems_rbtree_compare_result_intptr_t
); );
RTEMS_STATIC_ASSERT( RTEMS_STATIC_ASSERT(
sizeof( RBTree_Compare_result ) >= sizeof( int32_t ), sizeof( rtems_rbtree_compare_result ) >= sizeof( int32_t ),
RBTree_Compare_result_int32_t rtems_rbtree_compare_result_int32_t
); );
rtems_rbtree_node *rtems_rbtree_insert( rtems_rbtree_node *rtems_rbtree_insert(
rtems_rbtree_control *the_rbtree, rtems_rbtree_control *the_rbtree,
rtems_rbtree_node *the_node, rtems_rbtree_node *the_node,
RBTree_Compare compare, rtems_rbtree_compare compare,
bool is_unique bool is_unique
) )
{ {
@@ -34,16 +34,16 @@ rtems_rbtree_node *rtems_rbtree_insert(
rtems_rbtree_node *parent = NULL; rtems_rbtree_node *parent = NULL;
while ( *which != NULL ) { while ( *which != NULL ) {
RBTree_Compare_result compare_result; rtems_rbtree_compare_result compare_result;
parent = *which; parent = *which;
compare_result = ( *compare )( the_node, parent ); 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; return parent;
} }
if ( _RBTree_Is_lesser( compare_result ) ) { if ( rtems_rbtree_is_lesser( compare_result ) ) {
which = _RBTree_Left_reference( parent ); which = _RBTree_Left_reference( parent );
} else { } else {
which = _RBTree_Right_reference( parent ); which = _RBTree_Right_reference( parent );

View File

@@ -292,7 +292,7 @@ libscore_a_SOURCES += src/freechain.c
## RBTREE_C_FILES ## RBTREE_C_FILES
libscore_a_SOURCES += \ libscore_a_SOURCES += \
src/rbtreeextract.c src/rbtreefind.c \ src/rbtreeextract.c \
src/rbtreeinsert.c src/rbtreeiterate.c src/rbtreenext.c src/rbtreeinsert.c src/rbtreeiterate.c src/rbtreenext.c
libscore_a_SOURCES += src/rbtreereplace.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; 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. * @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 ) \ #define RBTREE_DEFINE_EMPTY( name ) \
RBTree_Control name = RBTREE_INITIALIZER_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. * @brief Rebalances the red-black tree after insertion of the node.
* *

View File

@@ -62,27 +62,6 @@ void _RBTree_Iterate(
void *visitor_arg 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 #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;
}