diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h index a5a6cf367b..818eee4290 100644 --- a/cpukit/score/include/rtems/score/rbtree.h +++ b/cpukit/score/include/rtems/score/rbtree.h @@ -387,6 +387,26 @@ RTEMS_INLINE_ROUTINE void _RBTree_Initialize_empty( RB_INIT( the_rbtree ); } +/** + * @brief Initializes this red-black tree to contain exactly the specified + * node. + * + * @param[in] the_rbtree The red-black tree control. + * @param[in] the_node The one and only node. + */ +RTEMS_INLINE_ROUTINE void _RBTree_Initialize_one( + RBTree_Control *the_rbtree, + RBTree_Node *the_node +) +{ + _Assert( _RBTree_Is_node_off_tree( the_node ) ); + RB_ROOT( the_rbtree ) = the_node; + RB_PARENT( the_node, Node ) = NULL; + RB_LEFT( the_node, Node ) = NULL; + RB_RIGHT( the_node, Node ) = NULL; + RB_COLOR( the_node, Node ) = RB_BLACK; +} + /** * @brief Returns the minimum node of the red-black tree. * diff --git a/testsuites/sptests/sprbtree01/init.c b/testsuites/sptests/sprbtree01/init.c index 054350815c..746b36ee3a 100644 --- a/testsuites/sptests/sprbtree01/init.c +++ b/testsuites/sptests/sprbtree01/init.c @@ -19,6 +19,30 @@ const char rtems_test_name[] = "SPRBTREE 1"; /* forward declarations to avoid warnings */ rtems_task Init(rtems_task_argument argument); +static void test_rbtree_init_one(void) +{ + RBTree_Control tree; + RBTree_Node node; + + puts( "INIT - Initialize one" ); + + _RBTree_Initialize_node( &node ); + _RBTree_Initialize_one( &tree, &node ); + rtems_test_assert( !_RBTree_Is_empty( &tree ) ); + rtems_test_assert( _RBTree_Is_root( &node ) ); + rtems_test_assert( !_RBTree_Is_node_off_tree( &node ) ); + rtems_test_assert( _RBTree_Left( &node ) == NULL ); + rtems_test_assert( _RBTree_Right( &node ) == NULL ); + rtems_test_assert( _RBTree_Parent( &node ) == NULL ); + rtems_test_assert( _RBTree_Successor( &node ) == NULL ); + rtems_test_assert( _RBTree_Predecessor( &node ) == NULL ); + rtems_test_assert( _RBTree_Minimum( &tree ) == &node ); + rtems_test_assert( _RBTree_Maximum( &tree ) == &node ); + + _RBTree_Extract( &tree, &node ); + rtems_test_assert( _RBTree_Is_empty( &tree ) ); +} + static const int numbers[20] = { 52, 99, 0, 85, 43, 44, 10, 60, 50, 19, 8, 68, 48, 57, 17, 67, 90, 12, 77, 71 }; @@ -2271,6 +2295,7 @@ rtems_task Init( rtems_task_argument ignored ) rtems_test_exit(0); } + test_rbtree_init_one(); test_rbtree_min_max(); test_rbtree_insert_inline(); test_rbtree_random_ops(); diff --git a/testsuites/sptests/sprbtree01/sprbtree01.scn b/testsuites/sptests/sprbtree01/sprbtree01.scn index 9cf21f3627..6b5e1d960b 100644 --- a/testsuites/sptests/sprbtree01/sprbtree01.scn +++ b/testsuites/sptests/sprbtree01/sprbtree01.scn @@ -30,6 +30,7 @@ INIT - Removing 100 nodes INIT - Verify rtems_rbtree_insert with 100 nodes value [99,0] INIT - Verify rtems_rbtree_find in a duplicate tree INIT - Removing 100 nodes +INIT - Initialize one INIT - Verify min/max node updates INIT - Verify _RBTree_Insert_inline INIT - Random operations