summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGedare Bloom <gedare@rtems.org>2012-03-29 20:41:34 -0400
committerGedare Bloom <gedare@rtems.org>2012-03-29 20:42:36 -0400
commit890358f4f7cb8bc3ac3dcbbe5805e8285c92444a (patch)
treeb939b17a28d00fe2a094bb2f64778da355f7bc40
parentPC386 - Add files missed in previous commit (diff)
downloadrtems-890358f4f7cb8bc3ac3dcbbe5805e8285c92444a.tar.bz2
PR1994: RBTree Compare Result Change
Change the meaning of the compare result to simplify comparison of integer keys.
-rw-r--r--cpukit/score/include/rtems/score/rbtree.h4
-rw-r--r--cpukit/score/inline/rtems/score/rbtree.inl23
-rw-r--r--cpukit/score/src/rbtreeinsert.c4
-rw-r--r--testsuites/sptests/sprbtree01/init.c8
4 files changed, 28 insertions, 11 deletions
diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h
index f0e3b4b5c0..7c439653a7 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -109,8 +109,8 @@ typedef enum {
* the order in a red-black tree.
*/
typedef int (*RBTree_Compare_function)(
- RBTree_Node *node1,
- RBTree_Node *node2
+ const RBTree_Node *node1,
+ const RBTree_Node *node2
);
/**
diff --git a/cpukit/score/inline/rtems/score/rbtree.inl b/cpukit/score/inline/rtems/score/rbtree.inl
index ef653e5628..c74726a30e 100644
--- a/cpukit/score/inline/rtems/score/rbtree.inl
+++ b/cpukit/score/inline/rtems/score/rbtree.inl
@@ -324,6 +324,25 @@ RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_header_unprotected(
return (RBTree_Control*)the_node;
}
+RTEMS_INLINE_ROUTINE bool _RBTree_Is_equal( int compare_result )
+{
+ return compare_result == 0;
+}
+
+RTEMS_INLINE_ROUTINE bool _RBTree_Is_greater(
+ int compare_result
+)
+{
+ return compare_result > 0;
+}
+
+RTEMS_INLINE_ROUTINE bool _RBTree_Is_lesser(
+ int compare_result
+)
+{
+ return compare_result < 0;
+}
+
/** @brief Find the node with given key in the tree
*
* This function returns a pointer to the node in @a the_rbtree
@@ -343,13 +362,13 @@ RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
int compare_result;
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
- if (compare_result == 0) {
+ if ( _RBTree_Is_equal( compare_result ) ) {
found = iter_node;
if ( the_rbtree->is_unique )
break;
}
- RBTree_Direction dir = (compare_result == 1);
+ RBTree_Direction dir = _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
} /* while(iter_node) */
diff --git a/cpukit/score/src/rbtreeinsert.c b/cpukit/score/src/rbtreeinsert.c
index 798bd87015..3ea6b354b4 100644
--- a/cpukit/score/src/rbtreeinsert.c
+++ b/cpukit/score/src/rbtreeinsert.c
@@ -97,9 +97,9 @@ RBTree_Node *_RBTree_Insert_unprotected(
/* typical binary search tree insert, descend tree to leaf and insert */
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
- if ( the_rbtree->is_unique && !compare_result )
+ if ( the_rbtree->is_unique && _RBTree_Is_equal( compare_result ) )
return iter_node;
- RBTree_Direction dir = (compare_result != -1);
+ RBTree_Direction dir = !_RBTree_Is_lesser( compare_result );
if (!iter_node->child[dir]) {
the_node->child[RBT_LEFT] = the_node->child[RBT_RIGHT] = NULL;
the_node->color = RBT_RED;
diff --git a/testsuites/sptests/sprbtree01/init.c b/testsuites/sptests/sprbtree01/init.c
index 38badc94d6..754876d5fa 100644
--- a/testsuites/sptests/sprbtree01/init.c
+++ b/testsuites/sptests/sprbtree01/init.c
@@ -28,16 +28,14 @@ typedef struct {
} test_node;
static int test_compare_function (
- rtems_rbtree_node* n1,
- rtems_rbtree_node* n2
+ const rtems_rbtree_node *n1,
+ const rtems_rbtree_node *n2
)
{
int key1 = rtems_rbtree_container_of( n1, test_node, Node )->key;
int key2 = rtems_rbtree_container_of( n2, test_node, Node )->key;
- if (key1 > key2) return 1;
- else if (key1 < key2) return -1;
- else return 0;
+ return key1 - key2;
}
/*