2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice,
16 this list of conditions and the following disclaimer in the documentation
17 and/or other materials provided with the distribution.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #ifndef CDSUNIT_TREE_TEST_BRONSON_AVLTREE_MAP_H
32 #define CDSUNIT_TREE_TEST_BRONSON_AVLTREE_MAP_H
34 #include "test_tree_map_data.h"
35 #include <cds/container/bronson_avltree_map_rcu.h>
36 #include <cds/sync/pool_monitor.h>
37 #include <cds/memory/vyukov_queue_pool.h>
41 namespace cc = cds::container;
43 class bronson_avltree_map: public cds_test::tree_map_fixture
46 static size_t const kSize = 1000;
52 // Precondition: map is empty
53 // Postcondition: map is empty
55 ASSERT_TRUE( m.empty());
56 ASSERT_CONTAINER_SIZE( m, 0 );
58 size_t const kkSize = kSize;
60 std::vector<key_type> arrKeys;
61 for ( int i = 0; i < static_cast<int>(kkSize); ++i )
62 arrKeys.push_back( key_type( i ));
63 shuffle( arrKeys.begin(), arrKeys.end());
65 std::vector< value_type > arrVals;
66 for ( size_t i = 0; i < kkSize; ++i ) {
68 val.nVal = static_cast<int>( i );
69 val.strVal = std::to_string( i );
70 arrVals.push_back( val );
74 for ( auto const& i : arrKeys ) {
75 value_type const& val( arrVals.at( i.nKey ));
77 ASSERT_FALSE( m.contains( i.nKey ));
78 ASSERT_FALSE( m.contains( i ));
79 ASSERT_FALSE( m.contains( other_item( i.nKey ), other_less()));
80 ASSERT_FALSE( m.find( i, []( key_type const&, value_type& ) {
83 ASSERT_FALSE( m.find( i.nKey, []( key_type const&, value_type& ) {
86 ASSERT_FALSE( m.find_with( other_item( i.nKey ), other_less(), []( key_type const&, value_type& ) {
90 std::pair< bool, bool > updResult;
92 switch ( i.nKey % 16 ) {
94 ASSERT_TRUE( m.insert( i ));
95 ASSERT_FALSE( m.insert( i ));
96 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
98 val.strVal = std::to_string( key.nKey );
102 ASSERT_TRUE( m.insert( i.nKey ));
103 ASSERT_FALSE( m.insert( i.nKey ));
104 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
106 val.strVal = std::to_string( key.nKey );
110 ASSERT_TRUE( m.insert( std::to_string( i.nKey )));
111 ASSERT_FALSE( m.insert( std::to_string( i.nKey )));
112 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
114 val.strVal = std::to_string( key.nKey );
118 ASSERT_TRUE( m.insert( i, val ));
119 ASSERT_FALSE( m.insert( i, val ));
122 ASSERT_TRUE( m.insert( i.nKey, val.strVal ));
123 ASSERT_FALSE( m.insert( i.nKey, val.strVal ));
126 ASSERT_TRUE( m.insert( val.strVal, i.nKey ));
127 ASSERT_FALSE( m.insert( val.strVal, i.nKey ));
130 ASSERT_TRUE( m.insert_with( i, []( key_type const& key, value_type& val ) {
132 val.strVal = std::to_string( key.nKey );
134 ASSERT_FALSE( m.insert_with( i, []( key_type const& /*key*/, value_type& /*val*/ ) {
135 EXPECT_TRUE( false );
139 ASSERT_TRUE( m.insert_with( i.nKey, []( key_type const& key, value_type& val ) {
141 val.strVal = std::to_string( key.nKey );
143 ASSERT_FALSE( m.insert_with( i.nKey, []( key_type const& /*key*/, value_type& /*val*/ ) {
144 EXPECT_TRUE( false );
148 ASSERT_TRUE( m.insert_with( val.strVal, []( key_type const& key, value_type& val ) {
150 val.strVal = std::to_string( key.nKey );
152 ASSERT_FALSE( m.insert_with( val.strVal, []( key_type const& /*key*/, value_type& /*val*/ ) {
153 EXPECT_TRUE( false );
157 updResult = m.update( i.nKey, []( bool, key_type const& /*key*/, value_type& /*val*/ ) {
158 EXPECT_TRUE( false );
160 ASSERT_FALSE( updResult.first );
161 ASSERT_FALSE( updResult.second );
163 updResult = m.update( i.nKey, []( bool bNew, key_type const& key, value_type& val ) {
167 ASSERT_TRUE( updResult.first );
168 ASSERT_TRUE( updResult.second );
170 updResult = m.update( i.nKey, []( bool bNew, key_type const& key, value_type& val ) {
171 EXPECT_FALSE( bNew );
172 EXPECT_EQ( key.nKey, val.nVal );
173 val.strVal = std::to_string( val.nVal );
175 ASSERT_TRUE( updResult.first );
176 ASSERT_FALSE( updResult.second );
179 updResult = m.update( i, []( bool, key_type const& /*key*/, value_type& /*val*/ ) {
180 EXPECT_TRUE( false );
182 ASSERT_FALSE( updResult.first );
183 ASSERT_FALSE( updResult.second );
185 updResult = m.update( i, []( bool bNew, key_type const& key, value_type& val ) {
189 ASSERT_TRUE( updResult.first );
190 ASSERT_TRUE( updResult.second );
192 updResult = m.update( i, []( bool bNew, key_type const& key, value_type& val ) {
193 EXPECT_FALSE( bNew );
194 EXPECT_EQ( key.nKey, val.nVal );
195 val.strVal = std::to_string( val.nVal );
197 ASSERT_TRUE( updResult.first );
198 ASSERT_FALSE( updResult.second );
201 updResult = m.update( val.strVal, []( bool, key_type const& /*key*/, value_type& /*val*/ ) {
202 EXPECT_TRUE( false );
204 ASSERT_FALSE( updResult.first );
205 ASSERT_FALSE( updResult.second );
207 updResult = m.update( val.strVal, []( bool bNew, key_type const& key, value_type& val ) {
211 ASSERT_TRUE( updResult.first );
212 ASSERT_TRUE( updResult.second );
214 updResult = m.update( val.strVal, []( bool bNew, key_type const& key, value_type& val ) {
215 EXPECT_FALSE( bNew );
216 EXPECT_EQ( key.nKey, val.nVal );
217 val.strVal = std::to_string( val.nVal );
219 ASSERT_TRUE( updResult.first );
220 ASSERT_FALSE( updResult.second );
223 ASSERT_TRUE( m.emplace( i.nKey ));
224 ASSERT_FALSE( m.emplace( i.nKey ));
225 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
227 val.strVal = std::to_string( key.nKey );
231 ASSERT_TRUE( m.emplace( i, i.nKey ));
232 ASSERT_FALSE( m.emplace( i, i.nKey ));
236 std::string str = val.strVal;
237 ASSERT_TRUE( m.emplace( i, std::move( str )));
238 ASSERT_TRUE( str.empty());
240 ASSERT_FALSE( m.emplace( i, std::move( str )));
241 ASSERT_TRUE( str.empty());
246 std::string str = val.strVal;
247 ASSERT_TRUE( m.emplace( i, i.nKey, std::move( str )));
248 ASSERT_TRUE( str.empty());
250 ASSERT_FALSE( m.emplace( i, i.nKey, std::move( str )));
251 ASSERT_TRUE( str.empty());
256 ASSERT_TRUE( m.contains( i.nKey ));
257 ASSERT_TRUE( m.contains( i ));
258 ASSERT_TRUE( m.contains( other_item( i.nKey ), other_less()));
259 ASSERT_TRUE( m.find( i, []( key_type const& key, value_type& val ) {
260 EXPECT_EQ( key.nKey, val.nVal );
261 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
263 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
264 EXPECT_EQ( key.nKey, val.nVal );
265 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
267 ASSERT_TRUE( m.find_with( other_item( i.nKey ), other_less(), []( key_type const& key, value_type& val ) {
268 EXPECT_EQ( key.nKey, val.nVal );
269 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
272 ASSERT_FALSE( m.empty());
273 ASSERT_CONTAINER_SIZE( m, kkSize );
275 ASSERT_TRUE( m.check_consistency());
277 shuffle( arrKeys.begin(), arrKeys.end());
280 for ( auto const& i : arrKeys ) {
281 value_type const& val( arrVals.at( i.nKey ));
283 ASSERT_TRUE( m.contains( i.nKey ));
284 ASSERT_TRUE( m.contains( val.strVal ));
285 ASSERT_TRUE( m.contains( i ));
286 ASSERT_TRUE( m.contains( other_item( i.nKey ), other_less()));
287 ASSERT_TRUE( m.find( i, []( key_type const& key, value_type& val ) {
288 EXPECT_EQ( key.nKey, val.nVal );
289 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
291 ASSERT_TRUE( m.find( i.nKey, []( key_type const& key, value_type& val ) {
292 EXPECT_EQ( key.nKey, val.nVal );
293 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
295 ASSERT_TRUE( m.find_with( other_item( i.nKey ), other_less(), []( key_type const& key, value_type& val ) {
296 EXPECT_EQ( key.nKey, val.nVal );
297 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
301 switch ( i.nKey % 8 ) {
303 ASSERT_TRUE( m.erase( i ));
304 ASSERT_FALSE( m.erase( i ));
307 ASSERT_TRUE( m.erase( i.nKey ));
308 ASSERT_FALSE( m.erase( i.nKey ));
311 ASSERT_TRUE( m.erase( val.strVal ));
312 ASSERT_FALSE( m.erase( val.strVal ));
315 ASSERT_TRUE( m.erase_with( other_item( i.nKey ), other_less()));
316 ASSERT_FALSE( m.erase_with( other_item( i.nKey ), other_less()));
319 ASSERT_TRUE( m.erase( i, []( key_type const& key, value_type& val ) {
320 EXPECT_EQ( key.nKey, val.nVal );
321 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
323 ASSERT_FALSE( m.erase( i, []( key_type const& /*key*/, value_type& /*val*/ ) {
324 EXPECT_TRUE( false );
328 ASSERT_TRUE( m.erase( i.nKey, []( key_type const& key, value_type& val ) {
329 EXPECT_EQ( key.nKey, val.nVal );
330 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
332 ASSERT_FALSE( m.erase( i.nKey, []( key_type const& /*key*/, value_type& /*val*/ ) {
333 EXPECT_TRUE( false );
337 ASSERT_TRUE( m.erase( val.strVal, []( key_type const& key, value_type& val ) {
338 EXPECT_EQ( key.nKey, val.nVal );
339 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
341 ASSERT_FALSE( m.erase( val.strVal, []( key_type const& /*key*/, value_type& /*val*/ ) {
342 EXPECT_TRUE( false );
346 ASSERT_TRUE( m.erase_with( other_item( i.nKey ), other_less(), []( key_type const& key, value_type& val ) {
347 EXPECT_EQ( key.nKey, val.nVal );
348 EXPECT_EQ( std::to_string( key.nKey ), val.strVal );
350 ASSERT_FALSE( m.erase_with( other_item( i.nKey ), other_less(), []( key_type const& /*key*/, value_type& /*val*/ ) {
351 EXPECT_TRUE( false );
356 ASSERT_FALSE( m.contains( i.nKey ));
357 ASSERT_FALSE( m.contains( i ));
358 ASSERT_FALSE( m.contains( val.strVal ));
359 ASSERT_FALSE( m.contains( other_item( i.nKey ), other_less()));
360 ASSERT_FALSE( m.find( i, []( key_type const& /*key*/, value_type& /*val*/ ) {
361 ASSERT_TRUE( false );
363 ASSERT_FALSE( m.find( i.nKey, []( key_type const& /*key*/, value_type& /*val*/ ) {
364 EXPECT_TRUE( false );
366 ASSERT_FALSE( m.find_with( other_item( i.nKey ), other_less(), []( key_type const& /*key*/, value_type& /*val*/ ) {
367 EXPECT_TRUE( false );
370 ASSERT_TRUE( m.empty());
371 ASSERT_CONTAINER_SIZE( m, 0 );
374 for ( auto const& i : arrKeys )
375 ASSERT_TRUE( m.insert( i ));
377 ASSERT_FALSE( m.empty());
378 ASSERT_CONTAINER_SIZE( m, kkSize );
382 ASSERT_TRUE( m.empty());
383 ASSERT_CONTAINER_SIZE( m, 0 );
386 for ( auto const& i : arrKeys )
387 ASSERT_TRUE( m.insert( i, arrVals[ i.nKey ] ));
388 ASSERT_FALSE( m.empty());
389 ASSERT_CONTAINER_SIZE( m, kkSize );
391 typedef typename Map::exempt_ptr exempt_ptr;
394 shuffle( arrKeys.begin(), arrKeys.end());
397 for ( auto const& i : arrKeys ) {
398 value_type const& val = arrVals.at( i.nKey );
400 ASSERT_TRUE( m.contains( i.nKey ));
402 switch ( i.nKey % 4 ) {
404 xp = m.extract( i.nKey );
410 xp = m.extract( val.strVal );
413 xp = m.extract_with( other_item( i.nKey ), other_less());
417 EXPECT_EQ( xp->nVal, i.nKey );
419 ASSERT_FALSE( m.contains( i.nKey ));
421 switch ( i.nKey % 4 ) {
423 xp = m.extract( i.nKey );
429 xp = m.extract( val.strVal );
432 xp = m.extract_with( other_item( i.nKey ), other_less());
437 ASSERT_TRUE( m.empty());
438 ASSERT_CONTAINER_SIZE( m, 0 );
442 shuffle( arrKeys.begin(), arrKeys.end());
443 for ( auto const& i : arrKeys )
444 ASSERT_TRUE( m.insert( i, arrVals[ i.nKey ] ));
448 while ( !m.empty()) {
449 switch ( nCount % 3 ) {
451 xp = m.extract_min();
454 xp = m.extract_min( [nKey]( key_type const& key ) {
455 EXPECT_EQ( nKey + 1, key.nKey );
461 xp = m.extract_min_key( key );
462 EXPECT_EQ( nKey + 1, key.nKey );
467 EXPECT_EQ( xp->nVal, nKey + 1 );
471 xp = m.extract_min();
473 EXPECT_EQ( kkSize, nCount );
474 ASSERT_TRUE( m.empty());
475 ASSERT_CONTAINER_SIZE( m, 0 );
478 shuffle( arrKeys.begin(), arrKeys.end());
479 for ( auto const& i : arrKeys )
480 ASSERT_TRUE( m.insert( i, arrVals[ i.nKey ] ));
484 while ( !m.empty()) {
485 switch ( nCount % 3 ) {
487 xp = m.extract_max();
490 xp = m.extract_max( [nKey]( key_type const& key ) {
491 EXPECT_EQ( nKey - 1, key.nKey );
497 xp = m.extract_max_key( key );
498 EXPECT_EQ( nKey - 1, key.nKey );
503 EXPECT_EQ( xp->nVal, nKey - 1 );
508 xp = m.extract_max();
510 EXPECT_EQ( kkSize, nCount );
511 ASSERT_TRUE( m.empty());
512 ASSERT_CONTAINER_SIZE( m, 0 );
519 class BronsonAVLTreeMap: public bronson_avltree_map
521 typedef bronson_avltree_map base_class;
523 typedef cds::urcu::gc<RCU> rcu_type;
529 cds::threading::Manager::attachThread();
534 cds::threading::Manager::detachThread();
539 TYPED_TEST_CASE_P( BronsonAVLTreeMap );
541 TYPED_TEST_P( BronsonAVLTreeMap, compare )
543 typedef typename TestFixture::rcu_type rcu_type;
544 typedef typename TestFixture::key_type key_type;
545 typedef typename TestFixture::value_type value_type;
547 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type,
548 typename cc::bronson_avltree::make_traits<
549 cds::opt::compare< typename TestFixture::cmp >
557 TYPED_TEST_P( BronsonAVLTreeMap, less )
559 typedef typename TestFixture::rcu_type rcu_type;
560 typedef typename TestFixture::key_type key_type;
561 typedef typename TestFixture::value_type value_type;
563 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type,
564 typename cc::bronson_avltree::make_traits<
565 cds::opt::less< typename TestFixture::less >
573 TYPED_TEST_P( BronsonAVLTreeMap, cmpmix )
575 typedef typename TestFixture::rcu_type rcu_type;
576 typedef typename TestFixture::key_type key_type;
577 typedef typename TestFixture::value_type value_type;
579 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type,
580 typename cc::bronson_avltree::make_traits<
581 cds::opt::less< typename TestFixture::less >
582 , cds::opt::compare< typename TestFixture::cmp >
590 TYPED_TEST_P( BronsonAVLTreeMap, stat )
592 typedef typename TestFixture::rcu_type rcu_type;
593 typedef typename TestFixture::key_type key_type;
594 typedef typename TestFixture::value_type value_type;
596 struct map_traits: public cc::bronson_avltree::traits
598 typedef typename TestFixture::less less;
599 typedef cc::bronson_avltree::stat<> stat;
602 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
608 TYPED_TEST_P( BronsonAVLTreeMap, item_counting )
610 typedef typename TestFixture::rcu_type rcu_type;
611 typedef typename TestFixture::key_type key_type;
612 typedef typename TestFixture::value_type value_type;
614 struct map_traits: public cc::bronson_avltree::traits
616 typedef typename TestFixture::cmp compare;
617 typedef cds::atomicity::item_counter item_counter;
620 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
626 struct bronson_relaxed_insert_traits: public cc::bronson_avltree::traits
628 static bool const relaxed_insert = true;
631 TYPED_TEST_P( BronsonAVLTreeMap, relaxed_insert )
633 typedef typename TestFixture::rcu_type rcu_type;
634 typedef typename TestFixture::key_type key_type;
635 typedef typename TestFixture::value_type value_type;
637 struct map_traits: public bronson_relaxed_insert_traits
639 typedef typename TestFixture::cmp compare;
640 typedef cds::atomicity::item_counter item_counter;
643 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
649 TYPED_TEST_P( BronsonAVLTreeMap, seq_cst )
651 typedef typename TestFixture::rcu_type rcu_type;
652 typedef typename TestFixture::key_type key_type;
653 typedef typename TestFixture::value_type value_type;
655 struct map_traits: public cc::bronson_avltree::traits
657 typedef typename TestFixture::cmp compare;
658 typedef cds::atomicity::item_counter item_counter;
659 typedef cds::opt::v::sequential_consistent memory_model;
662 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
668 TYPED_TEST_P( BronsonAVLTreeMap, sync_monitor )
670 typedef typename TestFixture::rcu_type rcu_type;
671 typedef typename TestFixture::key_type key_type;
672 typedef typename TestFixture::value_type value_type;
674 struct map_traits: public cc::bronson_avltree::traits
676 typedef typename TestFixture::cmp compare;
677 typedef cds::atomicity::item_counter item_counter;
678 typedef cds::sync::pool_monitor< cds::memory::vyukov_queue_pool< std::mutex >> sync_monitor;
681 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
687 TYPED_TEST_P( BronsonAVLTreeMap, lazy_sync_monitor )
689 typedef typename TestFixture::rcu_type rcu_type;
690 typedef typename TestFixture::key_type key_type;
691 typedef typename TestFixture::value_type value_type;
693 struct map_traits: public cc::bronson_avltree::traits
695 typedef typename TestFixture::cmp compare;
696 typedef cds::atomicity::item_counter item_counter;
697 typedef cds::sync::pool_monitor< cds::memory::lazy_vyukov_queue_pool< std::mutex >> sync_monitor;
700 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
706 TYPED_TEST_P( BronsonAVLTreeMap, rcu_check_deadlock )
708 typedef typename TestFixture::rcu_type rcu_type;
709 typedef typename TestFixture::key_type key_type;
710 typedef typename TestFixture::value_type value_type;
712 struct map_traits: public cc::bronson_avltree::traits
714 typedef typename TestFixture::cmp compare;
715 typedef cds::atomicity::item_counter item_counter;
716 typedef cds::sync::pool_monitor< cds::memory::vyukov_queue_pool< std::mutex >> sync_monitor;
717 typedef cds::opt::v::rcu_assert_deadlock rcu_check_deadlock;
720 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
726 TYPED_TEST_P( BronsonAVLTreeMap, rcu_no_check_deadlock )
728 typedef typename TestFixture::rcu_type rcu_type;
729 typedef typename TestFixture::key_type key_type;
730 typedef typename TestFixture::value_type value_type;
732 struct map_traits: public cc::bronson_avltree::traits
734 typedef typename TestFixture::cmp compare;
735 typedef cds::atomicity::item_counter item_counter;
736 typedef cds::sync::pool_monitor< cds::memory::lazy_vyukov_queue_pool< std::mutex >> sync_monitor;
737 typedef cds::opt::v::rcu_no_check_deadlock rcu_check_deadlock;
740 typedef cc::BronsonAVLTreeMap< rcu_type, key_type, value_type, map_traits > map_type;
746 REGISTER_TYPED_TEST_CASE_P( BronsonAVLTreeMap,
747 compare, less, cmpmix, stat, item_counting, relaxed_insert, seq_cst, sync_monitor, lazy_sync_monitor, rcu_check_deadlock, rcu_no_check_deadlock
752 #endif // #ifndef CDSUNIT_TREE_TEST_BRONSON_AVLTREE_MAP_H