2 //=============================================================================
4 * @file Map_Manager_Test.cpp
6 * This is a simple test of the <ACE_Map_Manager> and
7 * <ACE_Hash_Map_Manager> that illustrates how to use the forward
8 * and reverse iterators.
10 * @author Irfan Pyarali <irfan@cs.wustl.edu>
11 * @author Douglas C. Schmidt <d.schmidt@vanderbilt.edu>
12 * @author and Kirthika Parameswaran <kirthika@cs.wustl.edu>
14 //=============================================================================
17 #include "test_config.h"
18 #include "ace/Map_Manager.h"
19 #include "ace/Hash_Map_Manager.h"
20 #include "ace/Active_Map_Manager.h"
21 #include "ace/Profile_Timer.h"
22 #include "ace/Hash_Cache_Map_Manager_T.h"
23 #include "ace/Caching_Strategies_T.h"
25 typedef ACE_Null_Mutex MUTEX
;
26 typedef ACE_UINT32 TYPE
;
27 typedef ACE_Active_Map_Manager_Key
29 typedef ACE_Hash
<TYPE
>
31 typedef ACE_Equal_To
<TYPE
>
34 typedef ACE_Map_Manager
<TYPE
, TYPE
, MUTEX
>
36 typedef ACE_Map_Iterator
<TYPE
, TYPE
, MUTEX
>
38 typedef ACE_Map_Reverse_Iterator
<TYPE
, TYPE
, MUTEX
>
40 typedef ACE_Map_Entry
<TYPE
, TYPE
>
42 typedef ACE_Hash_Map_Manager_Ex
<TYPE
, TYPE
, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
44 typedef ACE_Hash_Map_Iterator_Ex
<TYPE
, TYPE
, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
46 typedef ACE_Hash_Map_Reverse_Iterator_Ex
<TYPE
, TYPE
, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
47 HASH_REVERSE_ITERATOR
;
48 typedef ACE_Hash_Map_Entry
<TYPE
, TYPE
>
50 typedef ACE_Active_Map_Manager
<TYPE
>
53 typedef ACE_Hash_Map_Manager_Ex
<TYPE
, std::pair
<TYPE
, int>, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
55 typedef ACE_Hash_Map_Iterator_Ex
<TYPE
, std::pair
<TYPE
, int>, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
57 typedef ACE_Hash_Map_Reverse_Iterator_Ex
<TYPE
, std::pair
<TYPE
, int>, HASH_KEY
, COMPARE_KEYS
, MUTEX
>
60 typedef ACE_Null_Cleanup_Strategy
<TYPE
, TYPE
, CACHE_MAP_IMPL
>
62 typedef ACE_Null_Caching_Utility
<TYPE
, TYPE
, CACHE_MAP_IMPL
, CACHE_ITER_IMPL
, ATTR
>
64 typedef ACE_Null_Caching_Strategy
<ATTR
, NULL_UTILITY
>
65 NULL_CACHING_STRATEGY
;
66 typedef ACE_Cache_Map_Manager
<TYPE
, TYPE
, CACHE_MAP_IMPL
, CACHE_ITER_IMPL
, CACHE_REV_ITER_IMPL
, NULL_CACHING_STRATEGY
, ATTR
>
68 typedef ACE_Hash_Cache_Map_Manager
<TYPE
, TYPE
, HASH_KEY
, COMPARE_KEYS
, NULL_CACHING_STRATEGY
, ATTR
>
69 HASH_CACHE_MAP_MANAGER
;
72 test_cache_map_manager (size_t table_size
,
76 NULL_CACHING_STRATEGY null_caching_strategy
;
77 CACHE_MAP_MANAGER
map (null_caching_strategy
,
83 for (i
= 0; i
< iterations
; i
++)
84 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
91 CACHE_MAP_MANAGER::ITERATOR end
= map
.end ();
93 for (CACHE_MAP_MANAGER::ITERATOR iter
= map
.begin ();
98 ACE_TEXT ("(%d|%d|%d)"),
105 ACE_DEBUG ((LM_DEBUG
,
107 ACE_TEST_ASSERT (i
== iterations
);
114 CACHE_MAP_MANAGER::REVERSE_ITERATOR rend
= map
.rend ();
116 for (CACHE_MAP_MANAGER::REVERSE_ITERATOR iter
= map
.rbegin ();
120 ACE_DEBUG ((LM_DEBUG
,
121 ACE_TEXT ("(%d|%d|%d)"),
128 ACE_DEBUG ((LM_DEBUG
,
130 ACE_TEST_ASSERT (k
== -1);
137 CACHE_MAP_MANAGER::iterator end
= map
.end ();
139 for (CACHE_MAP_MANAGER::iterator iter
= map
.begin ();
143 ACE_DEBUG ((LM_DEBUG
,
144 ACE_TEXT ("(%d|%d|%d)"),
151 ACE_DEBUG ((LM_DEBUG
,
153 ACE_TEST_ASSERT (i
== iterations
);
160 CACHE_MAP_MANAGER::reverse_iterator rend
= map
.rend ();
162 for (CACHE_MAP_MANAGER::reverse_iterator iter
= map
.rbegin ();
166 ACE_DEBUG ((LM_DEBUG
,
167 ACE_TEXT ("(%d|%d|%d)"),
174 ACE_DEBUG ((LM_DEBUG
,
176 ACE_TEST_ASSERT (k
== -1);
182 for (i
= 0; i
< iterations
; ++i
)
184 ACE_TEST_ASSERT (map
.find (i
, j
) != -1);
185 ACE_TEST_ASSERT (i
== j
);
188 size_t remaining_entries
= iterations
;
189 for (i
= 0; i
< iterations
; ++i
)
191 ACE_TEST_ASSERT (map
.unbind (i
) != -1);
193 ACE_TEST_ASSERT (map
.current_size () == remaining_entries
);
200 test_hash_cache_map_manager (size_t table_size
,
204 NULL_CACHING_STRATEGY null_caching_strategy
;
205 HASH_CACHE_MAP_MANAGER
map (null_caching_strategy
,
211 for (i
= 0; i
< iterations
; i
++)
212 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
219 HASH_CACHE_MAP_MANAGER::ITERATOR end
= map
.end ();
221 for (HASH_CACHE_MAP_MANAGER::ITERATOR iter
= map
.begin ();
225 ACE_DEBUG ((LM_DEBUG
,
226 ACE_TEXT ("(%d|%d|%d)"),
233 ACE_DEBUG ((LM_DEBUG
,
235 ACE_TEST_ASSERT (i
== iterations
);
242 HASH_CACHE_MAP_MANAGER::REVERSE_ITERATOR rend
= map
.rend ();
244 for (HASH_CACHE_MAP_MANAGER::REVERSE_ITERATOR iter
= map
.rbegin ();
248 ACE_DEBUG ((LM_DEBUG
,
249 ACE_TEXT ("(%d|%d|%d)"),
256 ACE_DEBUG ((LM_DEBUG
,
258 ACE_TEST_ASSERT (k
== -1);
265 HASH_CACHE_MAP_MANAGER::iterator end
= map
.end ();
267 for (HASH_CACHE_MAP_MANAGER::iterator iter
= map
.begin ();
271 ACE_DEBUG ((LM_DEBUG
,
272 ACE_TEXT ("(%d|%d|%d)"),
279 ACE_DEBUG ((LM_DEBUG
,
281 ACE_TEST_ASSERT (i
== iterations
);
288 HASH_CACHE_MAP_MANAGER::reverse_iterator rend
= map
.rend ();
290 for (HASH_CACHE_MAP_MANAGER::reverse_iterator iter
= map
.rbegin ();
294 ACE_DEBUG ((LM_DEBUG
,
295 ACE_TEXT ("(%d|%d|%d)"),
302 ACE_DEBUG ((LM_DEBUG
,
304 ACE_TEST_ASSERT (k
== -1);
310 for (i
= 0; i
< iterations
; ++i
)
312 ACE_TEST_ASSERT (map
.find (i
, j
) != -1);
313 ACE_TEST_ASSERT (i
== j
);
316 size_t remaining_entries
= iterations
;
317 for (i
= 0; i
< iterations
; ++i
)
319 ACE_TEST_ASSERT (map
.unbind (i
) != -1);
321 ACE_TEST_ASSERT (map
.current_size () == remaining_entries
);
328 test_active_map_manager (size_t table_size
,
332 ACTIVE_MAP_MANAGER
map (table_size
);
337 ACTIVE_MAP_MANAGER::key_type
*active_keys
;
339 ACE_NEW_RETURN (active_keys
,
340 ACTIVE_MAP_MANAGER::key_type
[iterations
],
346 ACE_TEST_ASSERT (map
.bind (i
, active_keys
[i
]) != -1);
353 ACTIVE_MAP_MANAGER::iterator end
= map
.end ();
355 for (ACTIVE_MAP_MANAGER::iterator iter
= map
.begin ();
359 ACTIVE_MAP_MANAGER::ENTRY
&entry
= *iter
;
360 ACE_DEBUG ((LM_DEBUG
,
361 ACE_TEXT ("(%d|%d-%d|%d)"),
363 entry
.ext_id_
.slot_index (),
364 entry
.ext_id_
.slot_generation (),
369 ACE_DEBUG ((LM_DEBUG
,
371 ACE_TEST_ASSERT (i
== iterations
);
377 ACTIVE_MAP_MANAGER::reverse_iterator rend
= map
.rend ();
379 for (ACTIVE_MAP_MANAGER::reverse_iterator iter
= map
.rbegin ();
383 ACTIVE_MAP_MANAGER::ENTRY
&entry
= *iter
;
384 ACE_UNUSED_ARG (entry
);
385 ACE_DEBUG ((LM_DEBUG
,
386 ACE_TEXT ("(%d|%d-%d|%d)"),
388 entry
.ext_id_
.slot_index (),
389 entry
.ext_id_
.slot_generation (),
394 ACE_DEBUG ((LM_DEBUG
,
396 ACE_TEST_ASSERT (k
== -1);
400 for (i
= 0; i
< iterations
; ++i
)
402 ACE_TEST_ASSERT (map
.find (active_keys
[i
], j
) != -1);
403 ACE_TEST_ASSERT (i
== j
);
406 size_t remaining_entries
= iterations
;
407 for (i
= 0; i
< iterations
; ++i
)
409 ACE_TEST_ASSERT (map
.unbind (active_keys
[i
]) != -1);
411 ACE_TEST_ASSERT (map
.current_size () == remaining_entries
);
414 delete [] active_keys
;
420 test_hash_map_manager (size_t table_size
,
424 HASH_MAP_MANAGER
map (table_size
);
429 for (i
= 0; i
< iterations
; i
++)
430 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
437 HASH_ITERATOR end
= map
.end ();
438 for (HASH_ITERATOR iter
= map
.begin ();
442 HASH_ENTRY
&entry
= *iter
;
443 ACE_DEBUG ((LM_DEBUG
,
444 ACE_TEXT ("(%d|%d|%d)"),
451 ACE_DEBUG ((LM_DEBUG
,
453 ACE_TEST_ASSERT (i
== iterations
);
458 HASH_ENTRY
*entry
= 0;
460 for (HASH_ITERATOR
iterator (map
);
461 iterator
.next (entry
) != 0;
464 ACE_DEBUG ((LM_DEBUG
,
465 ACE_TEXT ("(%d|%d|%d)"),
472 ACE_DEBUG ((LM_DEBUG
,
474 ACE_TEST_ASSERT (i
== iterations
);
479 HASH_REVERSE_ITERATOR rend
= map
.rend ();
481 for (HASH_REVERSE_ITERATOR iter
= map
.rbegin ();
485 HASH_ENTRY
&entry
= *iter
;
486 ACE_DEBUG ((LM_DEBUG
,
487 ACE_TEXT ("(%d|%d|%d)"),
494 ACE_DEBUG ((LM_DEBUG
,
496 ACE_TEST_ASSERT (k
== -1);
501 HASH_ENTRY
*entry
= 0;
503 for (HASH_REVERSE_ITERATOR
iterator (map
);
504 iterator
.next (entry
) != 0;
507 ACE_DEBUG ((LM_DEBUG
,
508 ACE_TEXT ("(%d|%d|%d)"),
515 ACE_DEBUG ((LM_DEBUG
,
517 ACE_TEST_ASSERT (k
== -1);
523 HASH_MAP_MANAGER::iterator end
= map
.end ();
524 for (HASH_MAP_MANAGER::iterator iter
= map
.begin ();
528 HASH_MAP_MANAGER::ENTRY
&entry
= *iter
;
529 ACE_DEBUG ((LM_DEBUG
,
530 ACE_TEXT ("(%d|%d|%d)"),
537 ACE_DEBUG ((LM_DEBUG
,
539 ACE_TEST_ASSERT (i
== iterations
);
544 HASH_MAP_MANAGER::ENTRY
*entry
= 0;
546 for (HASH_MAP_MANAGER::ITERATOR
iterator (map
);
547 iterator
.next (entry
) != 0;
550 ACE_DEBUG ((LM_DEBUG
,
551 ACE_TEXT ("(%d|%d|%d)"),
558 ACE_DEBUG ((LM_DEBUG
,
560 ACE_TEST_ASSERT (i
== iterations
);
565 HASH_MAP_MANAGER::reverse_iterator rend
= map
.rend ();
567 for (HASH_MAP_MANAGER::reverse_iterator iter
= map
.rbegin ();
571 HASH_MAP_MANAGER::ENTRY
&entry
= *iter
;
572 ACE_DEBUG ((LM_DEBUG
,
573 ACE_TEXT ("(%d|%d|%d)"),
580 ACE_DEBUG ((LM_DEBUG
,
582 ACE_TEST_ASSERT (k
== -1);
587 HASH_MAP_MANAGER::ENTRY
*entry
= 0;
589 for (HASH_MAP_MANAGER::REVERSE_ITERATOR
iterator (map
);
590 iterator
.next (entry
) != 0;
593 ACE_DEBUG ((LM_DEBUG
,
594 ACE_TEXT ("(%d|%d|%d)"),
601 ACE_DEBUG ((LM_DEBUG
,
603 ACE_TEST_ASSERT (k
== -1);
607 for (i
= 0; i
< iterations
; ++i
)
609 ACE_TEST_ASSERT (map
.find (i
, j
) != -1);
610 ACE_TEST_ASSERT (i
== j
);
613 size_t remaining_entries
= iterations
;
614 for (i
= 0; i
< iterations
; ++i
)
616 ACE_TEST_ASSERT (map
.unbind (i
) != -1);
618 ACE_TEST_ASSERT (map
.current_size () == remaining_entries
);
625 test_map_manager (size_t table_size
,
629 MAP_MANAGER
map (table_size
);
634 for (i
= 0; i
< iterations
; ++i
)
635 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
642 ITERATOR end
= map
.end ();
643 for (ITERATOR iter
= map
.begin ();
647 MAP_ENTRY
&entry
= *iter
;
648 ACE_DEBUG ((LM_DEBUG
,
649 ACE_TEXT ("(%d|%d|%d)"),
656 ACE_DEBUG ((LM_DEBUG
,
658 ACE_TEST_ASSERT (i
== iterations
);
663 MAP_ENTRY
*entry
= 0;
665 for (ITERATOR
iterator (map
);
666 iterator
.next (entry
) != 0;
669 ACE_DEBUG ((LM_DEBUG
,
670 ACE_TEXT ("(%d|%d|%d)"),
677 ACE_DEBUG ((LM_DEBUG
,
679 ACE_TEST_ASSERT (i
== iterations
);
684 REVERSE_ITERATOR rend
= map
.rend ();
686 for (REVERSE_ITERATOR iter
= map
.rbegin ();
690 MAP_ENTRY
&entry
= *iter
;
691 ACE_DEBUG ((LM_DEBUG
,
692 ACE_TEXT ("(%d|%d|%d)"),
699 ACE_DEBUG ((LM_DEBUG
,
701 ACE_TEST_ASSERT (k
== -1);
706 MAP_ENTRY
*entry
= 0;
708 for (REVERSE_ITERATOR
iterator (map
);
709 iterator
.next (entry
) != 0;
712 ACE_DEBUG ((LM_DEBUG
,
713 ACE_TEXT ("(%d|%d|%d)"),
720 ACE_DEBUG ((LM_DEBUG
,
722 ACE_TEST_ASSERT (k
== -1);
728 MAP_MANAGER::iterator end
= map
.end ();
729 for (MAP_MANAGER::iterator iter
= map
.begin ();
733 MAP_MANAGER::ENTRY
&entry
= *iter
;
734 ACE_DEBUG ((LM_DEBUG
,
735 ACE_TEXT ("(%d|%d|%d)"),
742 ACE_DEBUG ((LM_DEBUG
,
744 ACE_TEST_ASSERT (i
== iterations
);
749 MAP_MANAGER::ENTRY
*entry
= 0;
751 for (MAP_MANAGER::ITERATOR
iterator (map
);
752 iterator
.next (entry
) != 0;
755 ACE_DEBUG ((LM_DEBUG
,
756 ACE_TEXT ("(%d|%d|%d)"),
763 ACE_DEBUG ((LM_DEBUG
,
765 ACE_TEST_ASSERT (i
== iterations
);
770 MAP_MANAGER::reverse_iterator rend
= map
.rend ();
772 for (MAP_MANAGER::reverse_iterator iter
= map
.rbegin ();
776 MAP_ENTRY
&entry
= *iter
;
777 ACE_DEBUG ((LM_DEBUG
,
778 ACE_TEXT ("(%d|%d|%d)"),
785 ACE_DEBUG ((LM_DEBUG
,
787 ACE_TEST_ASSERT (k
== -1);
792 MAP_MANAGER::ENTRY
*entry
= 0;
794 for (MAP_MANAGER::REVERSE_ITERATOR
iterator (map
);
795 iterator
.next (entry
) != 0;
798 ACE_DEBUG ((LM_DEBUG
,
799 ACE_TEXT ("(%d|%d|%d)"),
806 ACE_DEBUG ((LM_DEBUG
,
808 ACE_TEST_ASSERT (k
== -1);
812 for (i
= 0; i
< iterations
; ++i
)
814 ACE_TEST_ASSERT (map
.find (i
, j
) != -1);
815 ACE_TEST_ASSERT (i
== j
);
818 size_t remaining_entries
= iterations
;
819 for (i
= 0; i
< iterations
; ++i
)
821 ACE_TEST_ASSERT (map
.unbind (i
) != -1);
823 ACE_TEST_ASSERT (map
.current_size () == remaining_entries
);
827 // This is extra for the map manager.
829 for (i
= 0; i
< iterations
; ++i
)
830 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
832 // Unbind in one swoop.
834 ACE_TEST_ASSERT (map
.current_size () == 0);
836 for (i
= 0; i
< iterations
; ++i
)
837 ACE_TEST_ASSERT (map
.bind (i
, i
) != -1);
839 // Unbind one at a time.
840 MAP_MANAGER::iterator end
= map
.end ();
843 MAP_MANAGER::iterator iter
= map
.begin ();
846 ACE_TEST_ASSERT (map
.unbind ((*iter
).ext_id_
) != -1);
849 ACE_TEST_ASSERT (map
.current_size () == 0);
855 run_test (int (*ptf
) (size_t, size_t, int),
859 const ACE_TCHAR
*test_name
)
861 ACE_Profile_Timer timer
;
864 (*ptf
) (table_size
, iterations
, test_iterators
);
868 ACE_Profile_Timer::ACE_Elapsed_Time et
;
870 timer
.elapsed_time (et
);
872 ACE_TCHAR
*test_iterators_string
= 0;
875 test_iterators_string
=
876 const_cast<ACE_TCHAR
*> (ACE_TEXT ( "includes executing iterators"));
878 test_iterators_string
=
879 const_cast<ACE_TCHAR
*> (ACE_TEXT ("doesn't include executing iterators"));
881 ACE_DEBUG ((LM_DEBUG
,
882 ACE_TEXT ("time to test a map of size %d for %d iterations using %s (%s)\n"),
886 test_iterators_string
));
888 ACE_DEBUG ((LM_DEBUG
,
889 ACE_TEXT ("real time = %f secs, user time = %f secs, system time = %f secs\n"),
894 ACE_timer_t time_result
= 0.0;
896 time_result
= (et
.real_time
/ ACE_timer_t (iterations
)) * 1000000;
898 ACE_DEBUG ((LM_DEBUG
,
899 ACE_TEXT ("time per call = %f usecs\n"),
906 run_main (int argc
, ACE_TCHAR
*argv
[])
908 ACE_START_TEST (ACE_TEXT ("Map_Manager_Test"));
909 ACE_LOG_MSG
->clr_flags (ACE_Log_Msg::VERBOSE_LITE
);
911 size_t table_size
= ACE_MAX_ITERATIONS
/ 2;
912 size_t iterations
= ACE_MAX_ITERATIONS
;
913 int test_iterators
= 1;
916 table_size
= ACE_OS::atoi (argv
[1]);
919 iterations
= ACE_OS::atoi (argv
[2]);
922 test_iterators
= ACE_OS::atoi (argv
[3]);
926 ACE_ERROR ((LM_ERROR
, "LM_ERROR@Table size is 0\n"));
931 // Test the <ACE_Map_Manager>.
932 result
+= run_test (&test_map_manager
,
936 ACE_TEXT ("Map_Manager"));
938 // Test the <ACE_Hash_Map_Manager>.
939 result
+= run_test (&test_hash_map_manager
,
943 ACE_TEXT ("Hash_Map_Manager"));
945 // Test the <ACE_Hash_Map_Manager>.
946 result
+= run_test (&test_active_map_manager
,
950 ACE_TEXT ("Active_Map_Manager"));
952 // Test the <ACE_Cache_Map_Manager>.
953 result
+= run_test (&test_cache_map_manager
,
957 ACE_TEXT ("Cache_Map_Manager"));
959 // Test the <ACE_Hash_Cache_Map_Manager>.
960 result
+= run_test (&test_hash_cache_map_manager
,
964 ACE_TEXT ("Hash_Cache_Map_Manager"));
966 ACE_LOG_MSG
->set_flags (ACE_Log_Msg::VERBOSE_LITE
);