diff options
author | Gedare Bloom <gedare@rtems.org> | 2012-03-29 20:41:34 -0400 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2012-03-29 20:42:36 -0400 |
commit | 890358f4f7cb8bc3ac3dcbbe5805e8285c92444a (patch) | |
tree | b939b17a28d00fe2a094bb2f64778da355f7bc40 | |
parent | PC386 - Add files missed in previous commit (diff) | |
download | rtems-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.h | 4 | ||||
-rw-r--r-- | cpukit/score/inline/rtems/score/rbtree.inl | 23 | ||||
-rw-r--r-- | cpukit/score/src/rbtreeinsert.c | 4 | ||||
-rw-r--r-- | testsuites/sptests/sprbtree01/init.c | 8 |
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; } /* |